2012-06-11 25 views
5

Tengo un problema con la codificación de caracteres en yii. Si se crea una nueva aplicación web:Error con los caracteres utf8 y htmlspecialchars en yii

./Yii-framework/framework/yiic webapp MyTest 

luego ir a /protected/views/layouts/main.php y cambiar el pie de página de un texto con un carácter UTF-8, por ejemplo

<div id="footer"> 
     Cópyrîgth <br /> 
</div> 

Actualizar la página y todo está bien. ¡Bonito! ;)

Y entonces trato de iniciar sesión con un carácter UTF-8 en el nombre de usuario, por ejemplo ADMIN, se bloquea diciendo:

Error 500 

htmlspecialchars(): Invalid multibyte sequence in argument 

lo que he comprobado este artículo sobre unicode in yii

y entonces fui a /protected/config/main.php y ha añadido esta línea en el inicio:

header('Content-Type: text/html; charset=utf-8'); 

Reintentando el mismo login de nuevo funciona (no se cuelga), pero ahora el pie de página se rompe y muestra:

C�pyr�ght 

He intentado otras combinaciones, como se explica en el artículo "Unicode en yü" pero ninguno de ellos hacen que ambas cosas funcionen al mismo tiempo.

¿Alguna idea para resolver este problema?

Nota: No puedo cambiar al archivo php.ini.

También probé el AddDefaultCharset UTF-8 opción en el archivo .htaccess y la puso en la carpeta en la/MyTest/es que la carpeta correcta en el referido artículo como: su DocumentRoot?

Gracias

+0

Estoy teniendo el mismo problema. ¿Encontraste alguna solución? – coderama

+0

esos signos de interrogación son el resultado de secuencias de bytes UTF-8 no válidas. Lo más probable es que esté usando un editor que guardó texto en una codificación de un solo byte, como, por ejemplo, [ISO 8859-1] (http://en.wikipedia.org/wiki/ISO/IEC_8859-1). En todas las codificaciones de un solo byte que son extensiones de ASCII, la parte extendida tiene valores de bytes> = 128. Todos los caracteres de un solo byte de UTF-8 son <128, todos los caracteres de varios bytes consisten en bytes> = 128. Por eso Los caracteres ISO 8859-x con signos diacríticos se convierten en signos de interrogación: nunca podrían ser válidos UTF-8, excepto en combinaciones poco probables. –

Respuesta

6

No estoy del todo familiarizado con yü, pero, si se desea pegar caracteres Unicode literales en un archivo, tiene que asegurarse de que su editor de texto guarda el archivo utilizando una codificación Unicode, como utf8. Pruebe utf8, sin una lista de materiales.

Mi experiencia es que los editores de texto se comportan de manera extraña cuando cambias la configuración de codificación y ya hay caracteres codificados en ella. Simplemente comience nuevamente con un archivo nuevo, cambie la codificación y luego pegue los caracteres.

+0

"usar una codificación Unicode, como utf8" no es un buen consejo, debería ser "usar la codificación UTF-8 Unicode". No se recomiendan otras codificaciones [Unicode] (http://en.wikipedia.org/wiki/Unicode) para la web. Y el [BOM] (http://en.wikipedia.org/wiki/Byte_order_mark) (marca de orden de bytes) tiene poco sentido en UTF-8, la mayoría de los editores ni siquiera consideran esta opción para UTF-8 (correctamente)) –

+0

Tengo que corregirme a mí mismo: aparentemente incluso hay un ejemplo de un editor que ** no ** puede guardar un archivo codificado en UTF-8 ** sin ** una lista de materiales: el Bloc de notas de Microsoft. Los usuarios de Windows que no quieran usar un editor de IDE aún pueden usar Notepad ++, que es gratuito y muy fácil de usar. –

2

Primero, debe eliminar la llamada de encabezado en el archivo main.php, podría crear problemas para usted en el futuro.

En segundo lugar, haría lo que sugirió el codificador de rambo y me aseguraré de que sus archivos se guarden como UTF8 en su editor.

+0

¿cómo podría la llamada de encabezado crear problemas en el futuro? –

1

Las soluciones anteriores parecen ser las correctas ya que Yii realmente no tiene un problema con los Unicodes, pero también podría realizar comprobaciones adicionales como el conjunto de caracteres dentro de la metaetiqueta en su página Html configurada como utf-8 y en lugar de escribiendo html simple puede usar Chtml :: encode (Copyright) para que yii maneje la codificación. Para la parte de nombre de usuario, asegúrese de que el juego de caracteres predeterminado en su base de datos también esté configurado en utf8.

0

La mejor forma de evitar esto es usar http://www.utexas.edu/learn/html/spchar.html - en su caso C ó pir î lucha haría aparece como C&#243;pyr&#238;ght

Además, agregaré en el HTML <meta charset="utf-8"> para asegurarme de que los navegadores se comporten bien.

+1

Dudablemente la mejor manera, en la configuración correcta del sistema utf no hay necesidad de codificar caracteres en entidades html. –

+0

No merece un voto a la baja, porque aunque técnicamente no es correcto, esta es una opción que me complace saber. – coderama

+0

"La mejor manera ALREDEDOR de esto" significa pasar por alto todas las complicaciones UTF8, esp. true cuando se trabaja con caracteres de varios bytes y se ve aparecer para user-agent (navegadores) con diferentes conjuntos de fuentes. –

3

En primer lugar, debe entender que un personaje con un signo diacrítico como ó o î (de su ejemplo) no es automáticamente un "carácter utf-8". Es simplemente un carácter que tiene diferentes codificaciones (si las hay) en diferentes conjuntos de caracteres, incluso en aquellos conjuntos de caracteres que tienen en común la parte básica ASCII de un solo byte (es decir, el alfabeto inglés, los dígitos, la puntuación más común y un poco mas). Podría llamarlo un "personaje problemático", pero no un "personaje utf-8".

Por lo tanto, cuando escribió su pie de página <div>, NO lo escribió codificado en UTF-8. Su editor guardó esos caracteres en una codificación de un solo byte, como ISO 8859-1 o uno de sus parientes.

Los navegadores normalmente detectan automáticamente la codificación utilizada en una página, si no está especificada. Es por eso que inicialmente fue capaz de ver en el navegador exactamente lo que había escrito en su editor.

Luego ha intentado iniciar sesión con un "carácter problemático" en el nombre de usuario. El navegador ha interpretado que su página tiene una codificación de un solo byte, por lo que ha codificado la entrada de su formulario de la misma manera y lo envía de vuelta codificado en un solo byte al servidor. El código PHP no se había escrito teniendo en cuenta esta posibilidad, al parecer, porque no configuraba correctamente el tercer parámetro de htmlspecialchars(), que es "UTF-8" de forma predeterminada (a partir de PHP 5.4.0 - anteriormente era "ISO-8859-1"). Como una cadena codificada de un solo byte con "caracteres problemáticos" casi nunca es una cadena UTF-8 válida (vea mi comentario a su pregunta, es el segundo comentario), htmlspecialchars() lo rechazó.

A continuación, agregó correctamente el header('Content-Type: text/html; charset=utf-8');, que deshabilitó la detección automática de juego de caracteres por el navegador. En este punto, se hizo evidente que su archivo con el pie de página <div> no estaba codificado en UTF-8 (consulte de nuevo mi comentario para obtener una explicación de los signos de interrogación que aparecen en lugar de los "caracteres problemáticos").

Así que todo lo que queda por hacer es convencer a su editor de que guarde los archivos codificados en UTF-8. Como otros han notado, guardar el archivo en una codificación diferente no funciona en todos los editores. Comenzar a partir de un archivo nuevo a veces es la solución, tal vez después de haber configurado la codificación predeterminada de su editor en UTF-8.

Para verificar la codificación, puede usar el comando file en un intérprete de comandos. Su salida debe ser algo como

main.php: PHP script, UTF-8 Unicode text 

O de lo contrario, podría utilizar el comando od -tx1z, que vuelca su archivo (tal vez | less), como una secuencia de bytes hexadecimales con la cadena correspondiente en el lado. Si el archivo está codificado de un solo byte, sus "caracteres problemáticos" serán bytes únicos> = 0x80. Si está codificado en UTF-8, serán secuencias de 2 bytes (otros serán 3 o más bytes), todos> = 0x80, mientras que los "caracteres no problemáticos" continuarán siendo bytes únicos < 0x80.

El artículo que menciona parece estar bien escrito, simplemente sígalo.

que no es necesario la directiva AddDefaultCharset en el archivo .htaccess, sin embargo, si todas sus páginas se generan con la cabecera HTTP Content-Type: text/html; charset=utf-8, debido a que el efecto de la directiva de Apache es exactamente el mismo (y es bueno para mantener el control en la codificación dentro de PHP).

Agregar el <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> tiene el mismo efecto, para el navegador, que el encabezado HTTP anterior (tenga en cuenta el http- equiv). El encabezado HTTP es más limpio, pero esta metaetiqueta adicional puede ayudar en caso de que una página se guarde sin la información del encabezado.

Lo más importante, no tengas miedo de UTF-8, ¡porque es tu amigo!

(... pero, a partir de la respuesta que obtuvo su recompensa, veo que, como muchas personas, sigue pensando que la comprensión de la codificación de caracteres es demasiado difícil para ti ☹)

+0

+10 para una respuesta completa y una cara triste al final que está en utf –

0

tuve este problema también - Específicamente cuando estaba tratando de mostrar texto utf desde db. Cambié todas las colaciones y tipos en mysql a utf8-bin, pero todavía no me gusta ... luego traté de modificar todos mis diseños y vistas con las metaetiquetas, etc ... demonios, incluso miré sitios web japoneses fuente código y pegó esas cosas en ... NADA TRABAJADO _ ... HASTA ... Me encontré con ESTA publicación: Yii And UTF8 Display, UTF8 works with mysqli but not yii backend Resulta que, necesita ajustar una configuración en mi main.php en el archivo de configuración, bajo los componentes .. f

Cuestiones relacionadas