2009-09-19 14 views

Respuesta

15

Para resumir: no se sabe realmente sobre la codificación (conjunto de caracteres) utilizada en las variables que se pasan a su script PHP a través de GET o POST (especialmente GET es un problema aquí). Por convención, los navegadores POST se forman en el recurso del lado del servidor especificado en el action -tributo utilizando la codificación de página que se puede especificar a través de http-equiv -meta-tag (charset -meta-tag en HTML5) o mediante un encabezado HTTP. Alternativamente, algunos navegadores también respetan el atributo accept-charset en el formulario al elegir la codificación correcta.

La codificación de los parámetros GET y la URL en sí misma depende de los stettings del navegador y, por lo tanto, puede ser controlada por el usuario. No deberías confiar en una codificación específica.

Generalmente circunnavegará la mayoría de los problemas relacionados con la codificación al usar UTF-8 para todo y al especificar la codificación correcta en el encabezado HTTP (Content-Type: text/html; charset=UTF-8) - esto arrojará la codificación correcta (UTF-8) en todos las variables que se pasan a su cadena (no estamos hablando de scripts de rouge que deliberadamente tratan de meterse con la codificación para permitir algunos vectores de ataque en su secuencia de comandos). Tampoco debe confiar en caracteres no ascii en sus parámetros GET o en la URL (esa es también una razón por la cual los enlaces compatibles con SEO eliminan esos caracteres o los sustituyen).

Si se aseguró de que UTF-8 es el único juego de caracteres permitido, puede usar mb_strlen($string, 'UTF-8') para verificar la longitud de una variable, por ejemplo.

EDIT: (añadido algunos enlaces)

Algunas cosas para que lo lea:

+0

La codificación de la URL depende también del documento de referencia. Solo si la URL se ingresa directamente en la barra de direcciones, la configuración del navegador es crucial. – Gumbo

5

usa mb_internal_encoding para saber qué codificación está configurada actualmente. Si su aplicación usa un registro de codificación diferente, es mejor que use mb_strlen.

Saludos

1

Por lo general, tienen el control de la codificación de caracteres ya que se crea el $ _REQUEST del HTML se envía al cliente.

ie: Es generado por una página que usted envió desde PHP.

Por lo tanto, no debería tener que detectar la codificación.

El uso de mb_functions requiere habilitar la extensión multibyte, por lo tanto, si está distribuyendo código, debe tener en cuenta que no todos lo tendrán.

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

OR en HTML:

<meta charset="utf-8"> 

http://www.w3.org/International/O-charset

Editar: PHP6 tiene soporte UTF-8, no PHP5.

+0

“las funciones de cadena son compatibles 8 UTF-” . ¿significa que strlen en php5 devolverá la longitud correcta de la cadena utf8? – lovespring

+0

"A partir de PHP5, las funciones de cadena son compatibles con UTF-8." Eso definitivamente no es correcto. Las funciones de cadena internas de PHP operan en el nivel de bytes, lo que significa que no pueden tratar con caracteres de varios bytes (válido para PHP <6). Todas las funciones internas donde la longitud de un carácter (en bytes) es importante para su funcionamiento son propensas a errores cuando se trabaja con esos conjuntos de caracteres. La extensión multibyte mencionada (mb_ *) tiene una capacidad de sobrecarga, pero desaconsejo encarecidamente su uso. –

+0

Estaba muy lejos, PHP5 no tiene soporte multibyte. – bucabay