2009-11-16 9 views
5

Estos últimos días he estado trabajando para convertir mi base de código PHP de latin1 a UTF-8. He leído que las dos soluciones principales son reemplazar las funciones de un solo byte con las funciones multibyte integradas o establecer el valor de mbstring.func_overload en el archivo php.ini.Uso del juego de caracteres UTF-8 con PHP: ¿se requieren funciones de mb?

Pero me encontré con this subproceso en la pila, donde la publicación de thomasrutter parece indicar que las funciones multibyte no son realmente necesarias para UTF-8, siempre que las secuencias de comandos y literales estén codificadas en UTF- 8.

No he encontrado ninguna otra evidencia de si esto es cierto o no, y si resulta que no necesito convertir mi código a mb_functions, ¡eso sería un verdadero ahorro de tiempo! ¿Alguien capaz de arrojar algo de luz sobre esto?

Respuesta

10

Por lo que yo entiendo el problema, siempre y cuando todos tus datos sean 100% en utf-8 - y eso significa entrada de usuario, base de datos y también la codificación de los archivos PHP si tienes caracteres especiales en ellos - esto es verdadero verdadero para operaciones de búsqueda y comparación. Como @ntd señala, un strlen() no multibyte producirá resultados incorrectos cuando se ejecuta en una cadena que contiene caracteres multibyte.

THis es un excelente artículo sobre los conceptos básicos de la codificación.

+0

Gracias a todos los que respondieron, ahora entiendo. ¡Muy apreciado! – Spoonface

2

thomasrutter indica que la búsqueda no necesita un manejo especial. Por ejemplo, si necesita verificar la longitud de una cadena UTF8, no veo cómo puede hacerlo utilizando el strlen() normal.

4

Ellos no son "necesarias" a menos que estés usando cualquiera de los functions they replace (y lo más probable es que son utilizando al menos uno de ellos) o de lo contrario necesitará explícitamente una función de la extensión, como HTTP handling.

Al trabajar para cumplir con UTF-8, siempre vuelvo al PHP UTF-8 Cheatsheet con una adición: los patrones PCRE deben actualizarse para usar el modificador u.

3

Tan pronto como esté examinando o modificando una cadena multibyte, necesita usar una función mb_ *. 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 
1

Hay una serie de funciones que esperan cadenas sean de un solo byte (Y algunos incluso presumen que es iso-8859 -1). En estos casos, debe ser consciente 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

2

Es posible que también se necesiten funciones como mb_strtoupper. strtoupper no convertirá á a Á.

Cuestiones relacionadas