Pregunta

Estos últimos días he estado trabajando para convertir mi base de código PHP de latin1 a UTF-8. He leído las dos soluciones principales son para reemplazar las funciones de un solo byte con el construido en funciones de varios bytes, o establecer el valor mbstring.func_overload en el archivo php.ini.

Pero entonces me encontré con este hilo de desbordamiento de pila, donde parece que el mensaje por thomasrutter para indicar que las funciones de varios bytes no son realmente necesarios para UTF-8, siempre que los literales de guión y de cadena están codificados en UTF-8.

No he encontrado ninguna otra prueba si esto es verdad o no, y si resulta que no necesito para convertir mi código para los mb_functions entonces que sería un gran ahorro de tiempo! Cualquier persona capaz de arrojar alguna luz sobre esto?

¿Fue útil?

Solución

Por lo que yo entiendo el problema, siempre y cuando todos sus datos están 100% en UTF-8 - y eso significa que la entrada del usuario, la base de datos, así como la codificación del PHP propios archivos si tiene caracteres especiales en ellos - esto es true cierto para las operaciones de búsqueda y comparación . Como señala @ntd, un strlen no multibyte () producirá resultados erróneos cuando se ejecuta en una cadena que contiene caracteres de varios bytes.

THis es un gran artículo sobre los fundamentos de la codificación.

Otros consejos

Ellos no son "necesarias" a menos que estés usando cualquiera de los funciones que reemplazan (y lo más probable es que son utilizando al menos uno de ellos) o de otra manera necesitan explícitamente una función de la extensión, como HTTP manipulación .

Cuando se trabaja hacia el cumplimiento UTF-8, que siempre se realice como la PHP UTF-8 Cheatsheet con una adición: necesita patrones PCRE ser actualizado para utilizar el modificador u

.

Tan pronto como usted está examinando o modificar una cadena de varios bytes, es necesario utilizar un mb_nogueira @ yahoo.com * función. Un ejemplo muy rápido, que demuestra por qué:

$str = "abcžđščćöçefg";
mb_internal_encoding("UTF-8");

echo "strlen: ".strlen($str)."\n";
echo "mb_strlen: ".mb_strlen($str)."\n";

Esto muestra:

strlen: 20
mb_strlen: 13

thomasrutter indica que el búsqueda no necesita un tratamiento especial. Por ejemplo, si es necesario comprobar la longitud de una cadena UTF-8, no veo cómo se puede hacer que el uso de strlen() sin formato.

funciones tales como mb_strtoupper que sean necesarias, también. strtoupper no va a convertir una a una.

Hay una serie de funciones que esperan cadenas sean solo byte (Y algunos incluso presumir que es iso-8859-1). En estos casos, es necesario ser conscientes de lo que está haciendo y posiblemente utilizar funciones de reemplazo. Hay una lista bastante completa en: http://www.phpwact.org/php/ i18n / UTF-8

Se puede usar la biblioteca mbfunctions que amplía las funciones multibyte en PHP:

http://code.google.com/p/mbfunctions/

Puede utilizar esta http://php.net/manual/en/mbstring.overload.php establecer en el archivo php.ini, por lo que no tiene que cambiar su código.

Pero tenga cuidado, porque no todos función de cadena se cambiará automáticamente. Este es uno: http://php.net/manual/en/function. substr-replace.php

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top