2009-09-07 24 views
5

Deseo emitir la siguiente cadena en PHP:Problema de codificación (UTF-8) en PHP

ä ö ü ß €

Por lo tanto, he codificado a UTF8 manualmente:

ä A¶ ü ß Â €

Así que mi guión es:

<?php 
header('content-type: text/html; charset=utf-8'); 
echo 'ä ö ü ß €'; 
?> 

Los 4 primeros caracteres son correctos (ö ü ß), pero por desgracia el signo € no es correcto:

ä ö ü ß

Here you can see it.

¿Me puede decir lo que he hecho mal? Mi editor (Notepad ++) tiene configuraciones para Codificación (Ansi/UTF-8) y Formato (Windows/Unix). ¿Tengo que cambiarlos?

Espero que me puedan ayudar. ¡Gracias por adelantado!

+3

Debe utilizar un editor que soporta UTF-8. Lo que hizo fue utilizar ISO 8859-1 para escribir las palabras de código de UTF-8. Usando UTF-8 podrías escribir 'ä ö ß ß '' directamente. – Gumbo

+1

Ah, lo siento, es Windows-1252 en lugar de ISO 8895-1 – Gumbo

+0

Sin embargo, es necesario utilizar UTF-8 para insertar U + FEFF al principio del archivo. Y PHP no le gusta eso en absoluto. – Joey

Respuesta

8

Ese último carácter simplemente no está en el archivo (intente ver la fuente), por lo que no lo ve.

Creo que será mejor que guarde el archivo PHP como UTF-8 (en Notepad ++ que las opciones están disponibles en Formato -> Codificar en UTF-8 sin BOM) e insertando los caracteres reales en su archivo PHP (es decir, en Notepad ++), en lugar de piratear con la inserción de à en todas partes. Puede encontrar el Mapa de caracteres de Windows útil para insertar caracteres Unicode.

+0

¿Por qué el voto a favor? ¿Tengo algo mal? –

+0

No, no lo creo. Todo está bien. ¡Gracias por la sugerencia con Notepad ++! – caw

5

El símbolo del euro (U + 20AC) está codificado en UTF-8 con tres bytes, no dos. Esto se puede ver here. Entonces su codificación es simplemente incorrecta.

+0

Gracias, esa parece ser la causa. :) – caw

+1

No es raro que cualquier manejador de texto elimine secuencias de bytes inválidas de la entrada. Entonces, cuando anuncie algo como UTF-8 e incluya UTF-8 no válido, entonces no espere que esté allí. – Joey

2

Debe siempre configure su editor con la misma codificación que el HTML generado le indica al navegador que use. Si la página HTML debe interpretarse como UTF-8, configure su editor de texto en UTF-8. PHP desconoce por completo la configuración de codificación del editor utilizado para crear el archivo; trata cadenas como una secuencia de bytes.

En otras palabras, siempre y cuando los bytes correctos estén en el archivo, todo funcionará. Y la forma más fácil de garantizar que los bytes correctos estén en el archivo, es establecer su codificación en la misma en la que se supone que está la página web. Cualquier otra cosa hace que la vida sea más difícil de lo que debería ser.

Pero la mejor defensa es dejar por completo los caracteres no ASCII fuera del código. Puede sacarlos de una base de datos o archivo de localización en su lugar. Esto significa que el código se puede modificar esencialmente en cualquier editor sin preocuparse por dañar la codificación.

+0

Gracias, haré esto en el futuro. Realmente hará que la codificación sea más fácil. – caw

4

Si desea emitir correctamente a UTF-8, la secuencia de comandos debe ser:

<?php 
header('content-type: text/html; charset=utf-8'); 
echo "\xc3\xa4"."\xc3\xb6"."\xc3\xbc"."\xc3\x9f"."\xe2\x82\xac"; 
?> 

De esa manera, incluso si su script PHP se guarda en una codificación UTF-8 no, que seguirá funcionando.

+0

Gracias. ¿Qué hace la línea de eco exactamente? – caw

+0

Echo cada uno de los siguientes caracteres codificados en utf8: ä ö ü ß €. En su pregunta original, dijo "Lo he codificado para utf8 manualmente". Para realmente hacer eso, vaya a http://www.utf8-chartable.de/ y busque ä, verá en utf8 que es "\ xc3 \ xa4"; – velcrow

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

Esto solo informa a los navegadores qué tipo de contenido vas a enviar y cómo debería tratarlo. No establece la codificación del contenido real que está enviando. Depende completamente de ti cumplir tu propia promesa.Su contenido no se transformará mágicamente de lo que sea a UTF-8 solo porque usted configure ese encabezado. Si le dice al navegador que trate el contenido como UTF-8, pero lo está enviando datos codificados en latín 1, por supuesto se romperá.

remito a What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text