una - ¿Por qué utilizar funciones de cadenas multibyte en PHP?
recorrer string php (5)
Por el momento, no entiendo por qué es realmente importante usar las funciones de mbstring en PHP cuando se trata de UTF-8. Mi configuración regional en Linux ya está configurada en UTF-8, entonces ¿por qué las funciones como strlen
, preg_replace
, etc. no funcionan correctamente de forma predeterminada?
Aquí está mi respuesta en inglés simple. Un único personaje japonés, chino y coreano toma más de un byte. Por ejemplo, una característica típica de x
es que toma 1 byte en inglés, tomará más de 1
byte en japonés, chino y coreano. Ahora las funciones de cadena estándar de PHP están destinadas a tratar un solo carácter como 1 byte. Entonces, en caso de que intentes comparar dos caracteres japoneses o chinos o coreanos, no funcionarán como se esperaba. Por ejemplo, la duración de "Hello World!" en japonés, chino o coreano tendrá más de 12 bytes.
La gente aquí no entiende UTF-8.
No necesita utilizar el código UTF-8 para procesar UTF-8. En la mayor parte.
Incluso he escrito un uppercaser / lowercaser de Unicode, y las transformaciones de NFC y de NFD, usando solamente funciones byte-aware. Es difícil pensar en algo más complicado que eso, que necesita un tratamiento tan delicado y detallado de UTF-8. Y, sin embargo, todavía funciona con funciones solo byte.
Es muy raro que necesite un código compatible con UTF-8. Tal vez contar el número de caracteres o mover un punto de inserción hacia adelante en 1 carácter. Pero en realidad, incluso entonces su código no funcionará;) debido a los caracteres descompuestos.
Pero si todo lo que hace es reemplazar, encontrar cosas o incluso analizar la sintaxis, solo necesita funciones de reconocimiento de bytes.
Explicaré por qué.
Es porque no se puede encontrar ningún carácter UTF-8 dentro de ningún otro carácter UTF-8. Así es como está diseñado.
Intenta explicarme cómo puedes obtener errores de procesamiento de texto, en términos de un sistema de varios bytes donde no se puede encontrar ningún personaje dentro de otro personaje. ¡Solo un ejemplo de caso! Lo más simple que puedas pensar
Todas las funciones de cadena de PHP no manejan cadenas multibyte independientemente de la configuración regional de su sistema operativo. Es por eso que necesita usar las funciones de cadenas multibyte.
Desde la introducción de la secuencia de multibyte :
Cuando manipula (recorta, divide, empalma, etc.) cadenas codificadas en una codificación multibyte, necesita usar funciones especiales ya que dos o más bytes consecutivos pueden representar un único carácter en tales esquemas de codificación. De lo contrario, si aplica una función de cadena no compatible con multibyte a la cadena, probablemente no pueda detectar el principio o el final del carácter multibyte y termine con una cadena de basura corrupta que muy probablemente pierde su significado original.
multibyte => multi + byte.
1) Se usa para trabajar con la cadena que está en otro idioma (no en inglés).
2) Las funciones de cadena de PHP predeterminadas solo funcionan correctamente con el idioma inglés (o se le aplica).
3) Si desea usar strlen () o strpos () o mayúsculas () o strreplace () para caracteres especiales,
Supongamos que necesitamos aplicar funciones de cadena en "Hola".
En lomos (你好), Árabe (مرحبا), Japonés (こ ん に ち,), Hindi (नमस्ते), Gujarati (હેલો).
Lenguaje diferente puede sus propios conjuntos de caracteres
de modo que mbstring se introdujo para comunicarse con varios idiomas como (lomos, japonés, etc.).
Las cadenas de PHP son simplemente secuencias de bytes. No tienen significado por sí mismos. Y tampoco usan ninguna codificación de caracteres en particular.
Por lo tanto, si lee un archivo utilizando file_get_contents()
obtendrá una representación binaria segura del archivo. Puede ser la representación (binaria) de una imagen o un archivo de texto legible por el ser humano. A PHP no le importa.
Ahora, siempre que solo necesites hacer un procesamiento básico de la cadena, no necesitas conocer la codificación de caracteres en absoluto. Por lo tanto, si desea almacenar la cadena nuevamente en un archivo usando file_put_contents()
o si desea obtener su longitud ( no la cantidad de caracteres ) usando strlen()
, está bien.
Sin embargo, tan pronto como comiences a hacer una manipulación de cadenas más elegante, ¡ necesitas saber la codificación de caracteres ! No hay forma de almacenarlo como parte de la cadena, por lo que debe rastrearlo por separado o, lo que hace la mayoría de la gente, usar la convención de tener todas las cadenas (de texto) en una codificación de caracteres común, como US-ASCII o hoy en día UTF-8 .
Entonces, como no hay forma de establecer una codificación de caracteres para una cadena, PHP no tiene idea de qué carácter está usando la cadena que codifica . Debido a eso, lo único sensato de strlen()
es devolver el número de bytes, ya que esto es lo único que PHP sabe con certeza.
Si proporciona la información adicional de la codificación de caracteres utilizada, necesita usar otra función: la función se llama mb_strlen()
en este caso.
Lo mismo se aplica a preg_replace()
: si desea reemplazar umlaut-a, o unir tres caracteres idénticos en una fila, necesita saber cómo está codificado umlaut-a, y en general, cómo se codifican los caracteres.
Entonces, si tiene una codificación hipotética de caracteres, que codifica una minúscula a
como a1
y una mayúscula como a2
, a b
como b1
y B
como b2
(y así sucesivamente), puede tener una cadena (codificada) a1a1a1
que consiste en tres personajes idénticos en una fila. Sin embargo, sin conocer la codificación y simplemente mirando la secuencia de bytes, no hay forma de detectar esto.
Resumen:
No es posible un "valor predeterminado" razonable ya que las cadenas de PHP no contienen la codificación de caracteres. E incluso si una sola función como strlen()
no puede devolver la longitud de la secuencia de bytes como se requiere para el encabezado HTTP Content-Length
y, al mismo tiempo, el número de caracteres es útil para indicar la longitud de un artículo de blog.
Es por eso que la función de sobrecarga de funciones se rompe de manera inherente e incluso si se ve bien al principio, romperá su código de una manera difícil de depurar.