2010-11-25 22 views
272

Tengo varias páginas PHP que resuenan varias cosas en las páginas HTML con el siguiente código.Establezca el encabezado HTTP en UTF-8 usando PHP

<meta http-equiv="Content-type" content="text/html; charset=utf-8" /> 

Sin embargo, cuando validar usando el W3C validator se trata con:

La codificación de caracteres especificada en la cabecera HTTP (iso-8859-1) es diferente del valor en el elemento (utf-8).

Soy bastante nuevo en PHP, y me preguntaba si podría y debería cambiar el encabezado de los archivos PHP para que coincidan con los archivos HTML.

Respuesta

800

Uso header para modificar el encabezado HTTP:

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

Nota llamar a esta función antes de cualquier salida se ha enviado al cliente. De lo contrario, el encabezado se ha enviado también y, obviamente, no puede cambiarlo más. Puede verificarlo con headers_sent. Consulte el manual page of header para obtener más información.

+3

Sólo añadiría que cuando se establece la cabecera HTTP correctamente como este, ya no necesita la etiqueta ''. – Jon

+3

@Jon: Yo usaría ambos. El equivalente HTTP "META" se usa cuando el documento HTML no se carga a través de HTTP (por ejemplo, desde el disco). – Gumbo

+5

Esto solo funcionará si ejecutas php, para hacerlo en páginas estáticas, debes guardar tu archivo html AS utf-8. Al hacerlo, se agregará el carácter BOM utf-8 codificado al comienzo del archivo. bytes 0xEF, 0xBB, 0xBF agregados al principio del archivo. La mayoría de los servidores web lo notarán y aplicarán el encabezado apropiado. De hecho, guardar su archivo php como utf-8, lograría lo mismo. – Rahly

13

Este es un problema con el servidor web el envío de una cabecera HTTP que no coincide con el que usted defina. Para obtener instrucciones sobre cómo hacer que el servidor envíe los encabezados correctos, consulte this page.

De lo contrario, también se puede usar PHP para modificar las cabeceras, pero esto tiene que ser hecho antes dar salida a cualquier texto que utiliza este código:

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

Más información sobre cómo enviar cabeceras usando PHP puede se encuentra en the documentation for the header function.

9

También puede utilizar camino más corto:

<?php header('Content-Type: charset=utf-8'); ?> 

Ver RFC 2616 su válida para especificar sólo juego de caracteres.

+0

Me gusta esta opción, porque (supongo) le permitirá establecer la otra parte del tipo de contenido por separado (por ejemplo, tiene algunas páginas de texto/sin formato, y algunas páginas de texto/html, pero todas son UTF8.) ¿Es correcto mi entendimiento? – Eric

+1

No puedo encontrar la parte de RFC 2616 que dice que es válido especificar de esa manera. 'Content-Type =" Content-Type "": "media-type' y' media-type = type "/" subtipo * (";" parameter) ' – AI0867

+1

No es válido solo para especificar el juego de caracteres. No es válido según RFC 2616 (que de todos modos es obsoleto) ni por RFC 7231 (que no está obsoleto) ni por ningún otro RFC. Consulte http://stackoverflow.com/questions/41994062/content-type-with-charset-only/41994400#41994400 – sideshowbarker

7

Para una correcta implementación, debe cambiar una serie de cosas.

base de datos (inmediatamente después de la conexión):.

mysql_query("SET NAMES utf8"); 
//Meta tag HTML.(probably its already set): 
meta charset="utf-8" 
header php.(before any output of the HTML): 
header('Content-Type: text/html; charset=utf-8') 
table-rows-charset(for each row): 
utf8_unicode_ci 
+3

La coalición de la base de datos no influye en el resultado generado por PHP porque los datos están codificados en el formato nativo configurado para usar con PHP antes de que se devuelva al usuario. En segundo lugar, OP no ha mencionado que está usando MySQL. En tercer lugar, MyISAM está desactualizado y no debería recomendarse a menos que sepa lo que está haciendo Hay una razón por la cual InnoDB se convirtió en el nuevo valor predeterminado. – EWit

+0

/\ lo que dijo. – pbond

+0

finalmente una lista completa de todos los lugares para establecer la codificación de caracteres. –

0

PHP enviar cabeceras de forma automática si se configuran codificación interna

ini_set('default_charset', 'utf-8'); 
Cuestiones relacionadas