2011-03-26 43 views
22

Tengo la instalación XAMPP estándar en win7 (x64). Después de haber tenido mi cuota de problemas de codificación en un proyecto anterior donde la codificación de mysql no coincidía con la codificación de php, que a veces daba como resultado html en otras codificaciones, decidí codificar de manera consistente todo usando utf-8.Las páginas html codificadas en UTF-8 muestran (signos de interrogación) en lugar de caracteres

Estoy empezando con el marcado de html y estoy experimentando problemas.

  • Mi página se guarda con UTF-8 (sin lista de materiales, creo)
    // actualización: Resulta que este no fue el caso. El archivo se guardó realmente con ISO_8859-1. Más tarde descubrí esto gracias a la respuesta de Sherm Pendleys. Tuve que volver atrás y cambiar la configuración de mi proyecto (que estaba configurada a "ISO-8859-1") al "UTF-8" deseado.
  • php se establece por .htaccess para servir .php-páginas en UTF-8 con: AddCharset UTF-8 .php
  • HTML tiene un meta Especificación de la etiqueta: <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  • Para probar I sistema usado php header('Content-Type:text/html; charset=UTF-8');

La página se sirve evidentemente en utf-8 (Firefox y Chrome lo reconocen como tal) pero cualquier carácter especial como é, á o ¡ se mostrará como . También al ver el código fuente.

Al eliminar la configuración de codificación mencionada anteriormente, todos los caracteres se representan correctamente, pero la codificación que se detecta muestra windows-1252 o ISO-8859-1 según el navegador.

¿Cómo es que? Estoy muy desconcertado. Hubiera esperado el comportamiento exactamente opuesto.
Cualquier consejo es bienvenido, ¡gracias!

edit: Espero que esto ayude un poco más. Esta es la cabecera de respuesta (según Firebug)

HTTP/1.1 200 OK 
Date: Sat, 26 Mar 2011 20:49:44 GMT 
Server: Apache/2.2.14 (Win32) DAV/2 mod_ssl/2.2.14 OpenSSL/0.9.8l mod_autoindex_color PHP/5.3.1 mod_apreq2-20090110/2.7.1 mod_perl/2.0.4 Perl/v5.10.1 
X-Powered-By: PHP/5.3.1 
Content-Length: 91 
Keep-Alive: timeout=5, max=99 
Connection: Keep-Alive 
Content-Type: text/html; charset=utf-8 

Respuesta

17

Cuando [cayendo] la configuración de codificación mencionado anteriormente todos los caracteres [sean impuestos] correctamente, pero la codificación que se detecta espectáculos ya sea windows-1252 o ISO-8859-1 dependiendo del navegador.

Entonces eso es lo que realmente está enviando. Ninguna de las configuraciones de codificación en su lista de viñetas realmente modificará su salida de ninguna manera; todo lo que hacen es decirle al navegador qué codificación suponer al interpretar lo que envía. Es por eso que estás obteniendo esos yous: le estás diciendo al navegador que lo que estás enviando es UTF-8, pero realmente es ISO-8859-1.

+4

¡Exactamente! Le está diciendo al servidor que diga "charset = utf-8", lo que no es realmente el caso. Los servidores y navegadores son criaturas confiadas. El servidor dirá lo que le diga, y el navegador cree lo que diga el servidor sobre la codificación, incluso si no es verdad. –

+2

En lo que respecta al * where * de donde proceden los datos que no son de utf-8, no hay forma de saber a partir de lo que ha publicado aquí. Si aparece un simple 'echo ("föö"); "como f , eso podría indicar que sus archivos .php se guardan como iso-8859-1. Si los datos se están obteniendo de una base de datos, puede usar mb_detect_encoding () para verificar su codificación. –

+4

Has acertado y me ha señalado al verdadero culpable. ¡Gracias! Parece que el archivo no se guardó como utf-8. Tuve que volver al entorno donde se creó. Allí, oculto en "proyecto". configuración "fue una opción establecida en" ISO-8859-1 ". Cambiar esta opción a" UTF-8 "y guardar los archivos nuevamente me dio los resultados deseados. No es necesario configurar' header(); 'ni modificaciones en la configuración de apaches o * .htaccess *. Un error tonto, realmente. Tanto molesto como gratificante. Gracias Sherm por su respuesta y comentarios! – leugim

6

Comprobar si alguno de sus archivos, que .php imprimir un texto, también se codifica correctamente en utf-8.

+0

No estoy seguro de si he entendido bien, pero un simple 'eco (E);' también salidas como ese maldito signo de interrogación. Actualicé mi respuesta con la información del encabezado. – leugim

+1

Me refiero a caso, cuando tienes un archivo base de php (utf-8) e incluyes en su algún otro archivo php sin una buena codificación – IProblemFactory

+0

¡Ah! ok en el momento en que es el caso más simple posible: un php con un eco simple y un marcado HTML básico con texto que contiene estos caracteres.No estoy incluyendo nada, todavía. además de las opciones de codificación mencionadas, eso es. – leugim

1

Soy de Brasil y creo mis bases de datos usando latin1_spanish_ci. Para el html y todo lo demás que utilizar:

charset=ISO-8859-1 

Los datos va a la derecha con é, ã y ç ... A veces tengo que poner los textos del HTML utilizando el código de la misma, tales como:

Ol&aacute; 

me da

Olá 

puede encontrar los códigos en esta página: http://www.ascii.cl/htmlcodes.htm

Espero que esto ayude. Recuerdo que fue REALMENTE molesto.

+0

¡Gracias por tu respuesta! Me gustaría encontrar una forma de no codificar los personajes. Pensé en usar utf-8 porque leí que abarca todos los caracteres posibles ... Podría resolver este problema cambiando a ISO-8859, pero me gustaría tener algo de luz sobre esto. – leugim

+0

comienza de nuevo con la configuración más simple posible, pero no comiences a escaparte de tus personajes con html. – tetris

1

El problema es el juego de caracteres que apache utiliza para servir las páginas. Trabajo con Linux, así que no sé nada sobre XAMPP. También tuve el mismo problema, lo que hice para resolver el problema fue agregar el juego de caracteres al archivo de configuración charset (se comenta por defecto).

En mi caso lo tengo en /etc/apache2/conf.d/charset pero, como usa Windows, la ubicación es diferente. Así que te estoy dando esto como una idea de cómo resolverlo.

Al final, mi fichero de configuración conjunto de caracteres es la siguiente:

# Read the documentation before enabling AddDefaultCharset. 
# In general, it is only a good idea if you know that all your files 
# have this encoding. It will override any encoding given in the files 
# in meta http-equiv or xml encoding tags. 

AddDefaultCharset UTF-8 

espero que ayude.

+0

Él ya lo hizo, es el segundo elemento en la lista de viñetas anterior. Y no ayudaría de todos modos; si lo que está enviando es ISO-8859-1, entonces especificar "charset = utf-8" en los encabezados HTTP solo sirve para confundir el navegador, haciendo que muestre esos s. –

2

Parece que nadie mencionó

SET NAMES utf8; 

encontré esta solución here y me ayudó. Cómo aplicarlo:

ser todo UTF-8, emitir la siguiente declaración justo después de que haya realizado la conexión con el servidor de base de datos: ajustar nombres UTF-8;

Quizás esto ayude a alguien.

+0

Consulte también: [Si se usa "ESTABLECER NOMBRES"] (http://stackoverflow.com/questions/1650591/whether-to-use-set-names) – hakre

+0

Gracias por la información y disculpe por la respuesta tardía. Siempre había usado mysql_set_charset() pero había un proyecto en el que tenía que hacer ajustes, y por alguna razón esta función no funcionaba. Probé varios otros métodos (incluso modifiqué httpd.conf y php.ini en mi máquina local) pero solo 'SET NAMES utf8' me ayudó. Por cierto, ahora se desaconseja el uso de mysql_set_charset(): http://php.net/manual/en/function.mysql-set-charset.php – Vitalius

+0

Sí, dependía de las versiones de MySQL y PHP, así que esto nunca fue tan sencillo como es hoy. Afortunadamente, las cosas mejoraron. – hakre

3

Dile DOP su charset inicialmente .... algo así como

PDO("mysql:host=$host;dbname=$DB_name;charset=utf8;", $username, $password); 

Aviso al: charset=utf8; parte.

Espero que ayude!

9

En mi caso, la base de datos devolvió latin1, cuando mi navegador esperaba utf8.

Así que para MySQLi lo hice:

mysqli_set_charset($dblink, "utf8");  

Ver http://php.net/manual/en/mysqli.set-charset.php para obtener más información

+0

Tu hombre, esto es lo que finalmente funcionó para mí. ¡Gracias hermano! –

Cuestiones relacionadas