2011-09-24 13 views
6

¿Cómo es que la longitud de las siguientes cadenas es diferente aunque el número de caracteres en las cadenas son las mismaslongitud de las cadenas en Unicode son diferentes

echo strlen("馐 馑 馒 馓 馔 馕 首 馗 馘")."<BR>"; 
echo strlen("Ɛ Ƒ ƒ Ɠ Ɣ ƕ Ɩ Ɨ Ƙ")."<BR>"; 

salidas

35 
26 
+0

@stereofrog ¿qué pasa con la letra 'a', por ejemplo? cuando aplicamos su valor unicode obtenemos 1 –

+0

Así es como funcionó para mí, ejemplo: echo mb_strlen ("αβγδε", mb_detect_encoding ("αβγδε")); da salida a 5 – Melsi

Respuesta

8

El primer lote de los personajes ocupan tres bytes cada uno, porque están muy abajo en la lista de caracteres de 39 mil ish, mientras que el segundo grupo solo toma dos bytes cada uno, alrededor de 400. (El número de bytes/octetos requerido por personaje se trata en el UTF-8 wikipedia article.)

strlen cuenta el número de bytes tomados por la cadena, lo que da resultados tan extraños en Unicode.

+0

¿Puedes explicar más cómo toman tres y dos bytes? –

+0

No soy un experto en cómo funciona Unicode, pero básicamente cada carácter es un número variable de bytes, y el bit más significativo de cada byte le dice al lector la longitud, o algo así. Acabo de buscar en Google por Unicode cuando necesitaba averiguarlo. –

+0

¿qué pasa con el, por ejemplo, la letra 'a'. cuando aplicamos su valor Unicode obtenemos 1 –

0

Uso mb_strlen, se cuentan personajes de codificación proporcionada, no bytes como strlen

2

Parece como si estuviera contando el número de bytes en la codificación que se utiliza. Por ejemplo, parece que la segunda cadena toma dos bytes por carácter no espacial, mientras que la primera cadena toma tres bytes por carácter no espacial. Esperaría:

echo strlen("A B C D E F G H I") 

para imprimir 17 - un solo byte por carácter ASCII.

Supongo que todo esto está usando la codificación UTF-8, que sin duda estaría en línea con el ancho variable de representación.

Cuestiones relacionadas