Pregunta

Hoy me encontré con un problema con la función php strpos() porque devolvió FALSE incluso si el resultado correcto era obviamente 0. Esto se debía a que un parámetro estaba codificado en UTF-8, pero el otro (el origen es un HTTP GET parámetro) obviamente no.

Ahora he notado que el uso de la función mb_strpos resolvió mi problema.

Mi pregunta ahora es: ¿Es prudente usar las funciones de cadena multibyte de PHP en general para evitar estos problemas en el futuro? ¿Debo evitar las funciones tradicionales strpos, strlen, ereg, etc., etc.?

Aviso: no quiero establecer mbstring.func_overload global en php.ini, porque esto genera otros problemas al usar la biblioteca PEAR. Estoy usando PHP4.

¿Fue útil?

Solución

Depende de la codificación de caracteres que esté utilizando. En codificaciones de caracteres de un solo byte, o UTF-8 (donde un solo byte dentro de un carácter nunca puede confundirse con otro carácter), siempre que la cadena que está buscando y la cadena que está buscando para buscar estén en el mismo codificación, entonces puede continuar utilizando las funciones de búsqueda de cadenas regulares.

Si está utilizando una codificación de varios bytes que no sea UTF-8, que no impide que aparezcan bytes individuales dentro de un carácter como otros caracteres, entonces nunca es seguro hacer una búsqueda de cadenas usando las funciones de búsqueda de cadenas normales. Puede encontrar falsos positivos. Esto se debe a que la comparación de cadenas de PHP en funciones como strpos es por byte, y con la excepción de UTF-8, que está específicamente diseñada para evitar este problema, las codificaciones de varios bytes sufren el problema de que cualquier byte posterior en un carácter compuesto por más de un byte puede coincidir con parte de un carácter diferente.

Si la cadena que está buscando en y la cadena que está buscando tienen codificaciones de caracteres diferentes, entonces la conversión siempre será necesaria. De lo contrario, encontrará que para cualquier cadena que se representaría de manera diferente en la otra codificación, siempre devolverá falso. Debe realizar dicha conversión en la entrada: decida sobre la codificación de caracteres que usará su aplicación y sea coherente dentro de la aplicación. Cada vez que reciba una entrada en una codificación diferente, realice la conversión en el camino.

Otros consejos

Ha habido algunos problemas con las funciones mb_ * en versiones de PHP anteriores a 5.2. Entonces, si su código se ejecuta en múltiples plataformas con diferentes versiones de PHP, puede ocurrir un comportamiento extraño. Además, la función mb_ strpos es bastante lenta, tiene que omitir el número de caracteres especificados por el parámetro offset para obtener la posición de byte real utilizada internamente. En los bucles que dependen de la funcionalidad strpos / mb_strpos, esto puede convertirse en un importante cuello de botella.

Si usa la misma codificación en todas partes, generalmente no es un problema. Utilizo UTF-8 para todas mis páginas, y nunca he encontrado este problema. Al final, todo se reduce a especificar la misma codificación para las páginas y la base de datos.

Por ejemplo:

header('Content-type: text/html;charset=utf-8');
mysql_query('SET NAMES utf8');

En la mayoría de los casos, esto significa que todas las fuentes de datos para la aplicación entregarán datos en la misma codificación, y así evitará este tipo de problemas.

Todo esto será mucho mejor con el advenimiento PHP 6, por cierto, ya que incluirá soporte completo para Unicode.

No necesariamente tiene que usar mb_strpos, pero debe asegurarse de que todos los datos de su aplicación sean los mismos: ya sea una mb_string o una cadena simple en una codificación particular. (Por lo general, UTF-8.)

Si se asegura de que sus páginas son UTF-8, y sus envíos de formularios se interpretan como UTF-8, y su base de datos almacena UTF-8, generalmente estará bien. Las operaciones de cadena indexadas (en particular, truncamientos) pueden romper una secuencia UTF-8, lo cual es molesto pero no generalmente desastroso. Si necesita ese nivel de soporte, mb_strings es su única opción (pero, por supuesto, debe asegurarse de que todas las partes de su aplicación y bibliotecas y la versión de PHP puedan hacer frente a ellas correctamente).

Desarrollar sitios que manejen Unicode correctamente en PHP no es demasiado divertido en este momento: su compatibilidad con Unicode es muy pobre en comparación con lenguajes como Python y .NET. Se espera que PHP6 mejore las cosas.

Recomendaría usar la siguiente biblioteca PHP UTF-8:

http://sourceforge.net/projects/phputf8

Agruparlo con su aplicación afloja los requisitos de su aplicación al no requerir la extensión mbstring, pero aún obtiene funciones de cadena UTF-8.

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