Uso del juego de caracteres UTF-8 con PHP: ¿se requieren funciones mb?

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.

Pero luego encontré este hilo en el desbordamiento de la stack, donde la publicación de thomasrutter parece indicar que las funciones multibyte no son realmente necesarias para UTF-8, siempre y cuando el script y los literales de cadena estén codificados 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 ahorro de tiempo real! ¿Alguien capaz de arrojar algo de luz sobre esto?

Por lo que 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 encoding de los archivos PHP si tienes caracteres especiales en ellos, esto es cierto 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.

Este es un gran artículo sobre los conceptos básicos de la encoding.

No son “necesarios” a menos que esté utilizando alguna de las funciones que reemplazan (y es probable que esté utilizando al menos uno de estos) o de otra manera explícitamente necesitan una característica de la extensión, como el manejo de HTTP .

Cuando trabajo para lograr el cumplimiento de UTF-8, siempre vuelvo a recurrir al PHP ChemSheet UTF-8 con una sola adición: los patrones PCRE deben actualizarse para usar el modificador u .

Tan pronto como estés examinando o modificando una cadena multibyte, necesitas 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 se imprime:

 strlen: 20 mb_strlen: 13 

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 hacer eso usando plain strlen() .

Funciones como mb_strtoupper pueden ser necesarias también. strtoupper no convertirá á a Á.

Hay una serie de funciones que esperan que las cadenas sean de un solo byte (y algunos incluso suponen 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

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

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

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

Pero ten cuidado, porque no todas las funciones de cadena se cambiarán automáticamente. Este es uno: http://php.net/manual/en/function.substr-replace.php