2010-02-23 22 views
9

Si tengo una matriz de bytes que contiene contenido UTF8, ¿cómo voy a analizarlo? ¿Hay bytes delimitadores que pueda dividir para obtener cada carácter?¿Hay bytes delimitadores para caracteres UTF8?

+0

Tenga cuidado con la entrada mal formada, asegúrese de que su código no haga algo malo, como un desbordamiento de búfer si una secuencia entra en más de 4 bytes, por ejemplo. –

+0

Una vez que haya hecho la selección de bits necesaria, terminará con un grupo de caracteres, cada uno de 1 a 4 bytes de longitud; ¿Qué vas a hacer con eso? ¿Por qué no lo decodifica y trabaja en los caracteres Unicode resultantes? –

+0

@JohnMachin en mi caso, el "grupo de caracteres" es demasiado grande para ser procesado de una vez, y mi código busca una compensación segura de bytes para dividir los datos en trozos más pequeños con los que se puede trabajar de forma individual. –

Respuesta

13

Echa un vistazo aquí ...

http://en.wikipedia.org/wiki/UTF-8

Si usted está mirando para identificar el límite entre los personajes, lo que necesita está en la tabla de "Descripción".

La única manera de obtener un bit alto cero es el subconjunto ASCII 0..127, codificado en un solo byte. Todos los puntos de código que no son ASCII tienen 2do byte en adelante con "10" en los dos bits más altos. El byte inicial de un punto de código nunca lo tiene: sus bits altos indican el número de bytes, pero hay cierta redundancia; también podría observar el siguiente byte que no tenga el "10" para indicar el siguiente punto de código.

0xxxxxxx : ASCII 
10xxxxxx : 2nd, 3rd or 4th byte of code 
11xxxxxx : 1st byte of code, further high bits indicating number of bytes 

Un punto de código en Unicode no es necesariamente lo mismo que un caracter. Hay puntos de código de modificación (como acentos), por ejemplo.

+0

¿Qué pasa con las secuencias de variación de emoji? Por ejemplo, si el carácter 'U + 1F469' (en binario' 11110000 10011111 10010001 10101001') está solo, se obtiene el emoji "mujer". Sin embargo, si es seguido por 'U + 1F3FD' (en binario' 11110000 10011111 10001111 10111101') entonces será una mujer con piel morena. ¿Cómo se puede detectar de forma segura este límite para evitar romper los bytes utf-8 entre los dos? Ambos puntos de código son válidos por sí solos (este último se representa como un cuadrado marrón en OS X), pero los usuarios no esperarían que se dividieran. –

+0

@AbhiBeckert: estás pensando en la capa incorrecta. UTF-8 no define ni le importa cómo las secuencias de puntos de código Unicode se relacionan entre sí. Primero, traduces UTF-8 (u otras codificaciones) a un flujo de punto de código Unicode, y luego lo interpretas. No conozco detalles específicos de Unicode, pero un enfoque general al problema de manejar los puntos de código modificadores es lo mismo que reconocer palabras clave y otros tokens en un tokenizador de lenguaje de programación. Probablemente haya una mejor manera específica para Unicode, pero no lo sé y, en cualquier caso, debería hacer una pregunta por separado. – Steve314

+0

Estoy tratando de identificar "el límite entre caracteres", donde un "personaje" es un solo glifo que se dibuja en la pantalla, que es exactamente la pregunta que está respondiendo por lo que puedo ver.Estoy dividiendo una cantidad grande (potencialmente gigabytes) de datos utf-8 en piezas más pequeñas (decenas de bytes de longitud) que se dibujan en la pantalla individualmente, y esto se romperá en silencio si los bytes están separados de la manera que sugiere en su responder. –

0

Los bytes que tienen el primer bit establecido en 0 son caracteres ASCII normales. Los bytes que tienen su primer bit establecido en 1 son parte de un carácter UTF-8.

El primer byte en cada carácter UTF-8 tiene su segundo bit establecido en 1, por lo que el byte tiene los bits más significativos 11. Cada byte siguiente que pertenece al mismo carácter UTF-8 comienza en su lugar con 10.

El primer byte de cada carácter UTF-8 indica, además, cuántos de los siguientes bytes pertenecen al carácter, dependiendo del número de bits que se establecen en 1 en los bits más significativos de ese byte.

Para obtener más información, consulte Wikipedia page para UTF-8.

+0

"carácter UTF-8" es un nombre inapropiado. Parece que se refiere a una secuencia de dos a cuatro bytes que representa un carácter no ASCII. Cuando se trata de entender Unicode, creo que tener el vocabulario correcto es la mitad de la batalla. –

Cuestiones relacionadas