Consulte también ¿Cómo sabe un archivo con caracteres chinos cuántos bytes utilizar por carácter? - Sin duda, hay otras preguntas de SO que también ayudarían.
En UTF-8, obtienes los siguientes tipos de bytes:
Binary Hex Comments
0xxxxxxx 0x00..0x7F Only byte of a 1-byte character encoding
10xxxxxx 0x80..0xBF Continuation bytes (1-3 continuation bytes)
110xxxxx 0xC0..0xDF First byte of a 2-byte character encoding
1110xxxx 0xE0..0xEF First byte of a 3-byte character encoding
11110xxx 0xF0..0xF4 First byte of a 4-byte character encoding
(La última línea parece que debería leer 0xF0..0xF7; sin embargo, el rango de 21 bits de Unicode (U + 0000 - U + 10FFFF) significa que el valor máximo válido es 0xF4; los valores 0xF5..0xF7 no pueden aparecer en UTF-8 válido.)
Ver si una secuencia particular de bytes es válida UTF-8 significa que debe pensar en:
- Bytes de continuación que aparecen donde no se esperaba
- Bytes de no continuación que aparecen donde se espera un byte de continuación
- Caracteres incompletos al final de la cadena (variación de 'byte de continuación esperado')
- Secuencias no mínimas
- Sustitutos UTF-16
En UTF-8 válido, los bytes 0xF5..0xFF no pueden ocurrir.
Secuencias no mínimas
Hay múltiples representaciones posibles para algunos personajes. Por ejemplo, el carácter Unicode U + 0000 (ASCII NUL) podría estar representado por:
0x00
0xC0 0x80
0xE0 0x80 0x80
0xF0 0x80 0x80 0x80
Sin embargo, el estándar Unicode establece claramente que las últimas tres alternativas no son aceptables porque no son mínimas. Sucede que los bytes 0xC0 y 0xC1 nunca pueden aparecer en UTF-8 válido porque los únicos caracteres que podrían ser codificados por ellos están codificados mínimamente como caracteres de un solo byte en el rango 0x00..0x7F.
Sustitutos UTF-16
Dentro del plano multilingüe básico (BMP), los valores Unicode U + D800 - U + DFFF están reservados para sustitutos UTF-16 y no pueden aparecer codificados en UTF-8 válido. Si fueran válidos en UTF-8 (que, enfatizo, no lo son), entonces los sustitutos estarían codificados:
- U + D800 - 0xED 0xA0 0x80 (sustituto alto más pequeño)
- U + DBFF - 0xED 0xAF 0xBF (sustituto alto más grande)
- U + DC00 - 0xED 0xB0 0x80 (suplente bajo más pequeño)
- U + DFFF - 0xED 0xBF 0xBF (suplente bajo más grande)
Datos incorrectos
Por lo tanto, sus datos MALOS deben contener muestras que violen estas diversas prescripciones.
- Byte de continuación no precedido por uno de los valores de byte iniciales
- Bytes iniciales de varios caracteres no seguidos por suficientes bytes de continuación
- Caracteres multibyte no mínimos
- Sustitutos UTF-16
- Bytes no válidos (0xC0, 0xC1, 0xF5..0xFF).
Tenga en cuenta que una marca de orden de bytes (BOM) U + FEFF, también conocida como espacio sin interrupciones de ancho cero (ZWNBSP), no puede aparecer sin codificar en UTF-8; los bytes 0xFF y 0xFE no están permitidos en UTF-8 válido. Un ZWNBSP codificado puede aparecer en un archivo UTF-8 como 0xEF 0xBB 0xBF, pero el BOM es completamente superfluo en UTF-8.
También hay algunos no caracteres en Unicode. U + FFFE y U + FFFF son dos de estos no caracteres (y los dos últimos puntos de código en cada plano, U + 1FFFE, U + 1FFFF, U + 2FFFE, U + 2FFFF, ... U + 10FFFE, U + 10FFFF son otros ). Normalmente, estos no deberían aparecer en datos Unicode para el intercambio de datos, pero pueden aparecer en uso privado. Consulte el enlace de preguntas frecuentes sobre Unicode para ver muchos detalles sórdidos, incluida la historia bastante compleja de los no personajes en Unicode. ( Corrigendum # 9: Aclaración sobre los no personajes , que se publicó en enero de 2013, hace lo que sugiere su título: aclara el significado de los no personajes).