2009-10-22 9 views
16

Qué extensiones recomendaría y cómo se debería configurar php para crear un sitio web que use codificación utf-8 para todo. por ejemplo ...Cómo configurar mejor PHP para manejar un sitio web UTF-8

  • resultado de la página es formas UTF-8
  • presentar datos codificados en UTF-8
  • procesamiento interno de datos de cadena (por ejemplo, cuando se habla de una base de datos) están todos en UTF-8 como bien.

Parece que php realmente no se adapta bien con juegos de caracteres multibyte en este momento. Hasta ahora he calculado que mbstring parece una extensión importante.

¿Vale la pena la molestia ..?

+0

He estado utilizando con éxito instalaciones de PHP estándar con archivos fuente UTF-8 generando salida UTF-8 que incluye caracteres especiales UTF-8 como ♕ ⚐ y ✔ desde 4.1.x. :) – Pascal

+0

Obtener la salida UTF-8 correcta no prueba que su código esté analizando ** la entrada ** correctamente y esté protegido contra secuencias maliciosas. – Pacerier

+0

** Actualización ** A lo largo de esta sesión de preguntas y respuestas, considere usar 'utf8mb4' en MySQL en lugar de' utf8'. (Contraste, el término no-MySQL 'UTF-8'.) –

Respuesta

46

Los supuestos problemas de PHP con contenido Unicode han sido algo exagerados. He estado haciendo sitios web multilingües desde 1998 y nunca supe que podría haber un problema hasta que lo haya leído en alguna parte, muchos años y sitios web más adelante.

Esto funciona muy bien para mí:

configuración de Apache (httpd.conf o en .htaccess)

AddDefaultCharset utf-8 

PHP (en php.INI)

default_charset = "utf-8" 
mbstring.internal_encoding=utf-8 
mbstring.http_output=UTF-8 
mbstring.encoding_translation=On 
mbstring.func_overload=6 

MySQL

CREATE su base de datos con una intercalación utf8_*, vamos a las tablas heredan la intercalación de base de datos y comienzan cada conexión con "SET NAMES utf8"

HTML (en el elemento HEAD)

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

¿Qué hace realmente la declaración SQL" SET NAMES utf8 "? –

+1

Directamente desde los documentos de MySQL: "Una instrucción SET NAMES 'x' es equivalente a estas tres instrucciones: SET character_set_client = x; SET character_set_results = x; SET character_set_connection = x;" Esto es útil porque no importa qué juego de caracteres use para almacenar los datos, los datos todavía tienen que viajar hacia y desde PHP. Es posible que nunca se note un problema al usar una sola computadora (como en HTML FORM -> MySQL -> página), pero usar una máquina de desarrollo para llenar una base de datos y moverla al servidor de producción para generarla es arriesgado, ya que las dos pueden bien tener diferentes conjuntos de caracteres del cliente. SET NAMES significa portabilidad. – djn

+0

¿Todavía puede usar las funciones de cadena de PHP o tiene que usar las 'mb_'? –

1

Si mbstring no es ya parte de su paquete PHP, definitivamente se lo recomendaría, incluso querrá usarlo para calcular longitudes de cadena (mb_strlen ($ string_var, 'utf8')) para la forma input ... De lo contrario, no necesitará nada excepto HTML válido y correcto, una configuración http-server correcta (para que el servidor entregue páginas que usen utf-8) y un editor de texto con utf-8-support (ej. Notepad ++)

1

En su php.ini, establezca

mbstring.internal_encoding = UTF-8 
mbstring.encoding_translation = On 

de modo que usted no tiene que pasar un parámetro de codificación de las funciones mb_nogueira @ yahoo.com cada vez.

2

php copes ¡muy bien!

Debe establecer el parámetro php.ini "default_charset" en 'utf-8'.

El asegúrese de que: -

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

es en la parte superior de cada página que sirve.

Hay algunas áreas problemáticas:

Bases de datos - Asegúrese de que están configurados para utilizar UTF-8 por omisión o entrar en un mundo de dolor.

IDEs/Editores - muchos editores no son compatibles con utf-8. Normalmente uso vim que no, pero nunca ha sido un gran problema.

Documentos - Acabo de pasar toda la tarde haciendo que php lea caracteres tailandeses de una hoja de cálculo. Finalmente tuve éxito pero todavía no estoy seguro de lo que hice bien.

3

Estaba enfrentando el mismo problema para UTF-8 characters, todo estaba funcionando en el servidor en vivo y en el servidor de transición, pero a veces se está rompiendo mi máquina de desarrollo. El comportamiento fue tan extraño, algunos caracteres veces que se codifican correctamente, pero en la página al azar recargar fue empezar a romper con Diamond Charters'���เห็นอเวิลด์!���' o Question mark'??�เห็นอเวิลด์!???' o el 85% de datos se muestra adecuadamente 'เห็นอเวิลด์!?��' pero ten por 15% estaba mostrando personajes inigualables. Estaba buscando arreglar el problema.Así, comenzó con mi lista de comprobación

1 - Comprobar si el personaje cabecera añadida en HTML


2 - Verificar si los datos adecuada guardan en la tabla de MySQL


3 - Compruebe si MySQL tiene la configuración de codificación adecuados para UTF-8


4 - Comprobar si Apache se ajuste para hacer frente a UTF-8 juego de caracteres


5 - Comprobar si PHP simple puede echo "เห็น อ เวิลด์" la misma salida como entrada "เห็น อ เวิลด์"


6 - Comprobar si PHP enviar la salida encabezados adecuada


7 - Comprobar si MySQL Query g etting mismos datos "เห็น อ เวิลด์"


8 - Compruebe si "เห็น อ เวิลด์" tiene algunos caracteres HTML, tratar con ellos adecuadamente


9 - Compruebe si "เห็น อ เวิลด์" pasa a través de un ny html codificar la función de decodificación


10- Comprobar si .htaccess todo listo para hacer frente a UTF-8 Juego de caracteres


Marque todo lo anterior lista para descubrir dónde algo ... desgarro.

Dales una oportunidad (estoy usando CodeIgniter):

================================= 
:: PHP ini Settings:: 
================================= 

default_charset = "utf-8" 
mbstring.internal_encoding=utf-8 
mbstring.http_output=UTF-8 
mbstring.encoding_translation=On 
mbstring.func_overload=6 

================================= 
:: .htaccess Settings:: 
================================= 

DefaultLanguage en-US 
AddDefaultCharset UTF-8 

================================= 
:: HTML Header Page:: 
================================= 

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

================================= 
:: PHP Codeigniter index.php :: 
================================= 

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

================================= 
:: Codeigniter config.php :: 
================================= 

$config['charset'] = 'UTF-8'; 

================================= 
:: Codeigniter database.php :: 
================================= 

$db['default']['char_set'] = 'utf8'; 
$db['default']['dbcollat'] = 'utf8_general_ci'; 

================================= 
:: Codeigniter helper function (optional) 
================================= 

if(!function_exists('safe_utf_string')){ 
    function safe_utf_string($utf8string= ''){ 
     $utf8string = htmlspecialchars($utf8string, ENT_QUOTES, 'UTF-8'); 
     return mb_convert_encoding($utf8string, 'UTF-8'); 
    } 
} 

y, finalmente, no se olvide de decir Gracias! :) a @djn respuesta

+0

Es posible que necesite 'utf8mb4' en lugar de' utf8' en MySQL. ¿Puedes proporcionar el hexágono para los personajes que se convirtieron en diamantes negros? O los personajes que deberían haber estado allí? Cuando el hex es 4 bytes: 'F0xxyyzz', utf8 no será suficiente; utf8mb4 es obligatorio. –

Cuestiones relacionadas