La detección de codificación de caracteres , detección de conjunto de caracteres o detección de página de códigos es el proceso de adivinar heurísticamente la codificación de caracteres de una serie de bytes que representan texto. Se reconoce que esta técnica no es fiable [ 1 ] y solo se utiliza cuando no se dispone de metadatos específicos , como un encabezado HTTP Content-Type:, o cuando se asume que no son fiables.
Este algoritmo generalmente implica un análisis estadístico de patrones de bytes; [ 2 ] dicho análisis estadístico también puede utilizarse para realizar la detección de idiomas . [ 2 ] Este proceso no es infalible porque depende de datos estadísticos. [ 1 ]
En general, la detección incorrecta del conjunto de caracteres conduce a mojibake , debido a que los bytes de caracteres se interpretan como pertenecientes a un conjunto —el detectado incorrectamente— cuando en realidad pertenecen a uno completamente diferente. [ 3 ] [ 4 ]
Uno de los pocos casos en los que la detección de conjuntos de caracteres funciona de manera confiable es la detección de UTF-8 . [ 5 ] Esto se debe al alto porcentaje de secuencias de bytes no válidas en UTF-8, [ nota 1 ] por lo que es extremadamente improbable que un texto en cualquier otra codificación que utilice bytes con el bit alto activado pase una prueba de validez de UTF-8. [ 5 ] Sin embargo, las rutinas de detección de conjuntos de caracteres mal escritas no ejecutan primero la prueba confiable de UTF-8 y pueden decidir que UTF-8 es alguna otra codificación. Por ejemplo, los sitios web en UTF-8 que contienen el nombre de la ciudad alemana de Múnich pueden mostrar "München" , debido a que el código decide que la codificación era ISO-8859-1 o Windows-1252 antes (o sin) siquiera comprobar si era UTF-8.
UTF-16 es bastante fiable para detectar debido a la gran cantidad de saltos de línea (U+000A) y espacios (U+0020) que deberían encontrarse al dividir los datos en palabras de 16 bits, y a la gran cantidad de bytes NUL en posiciones pares o impares. Se deben comprobar los caracteres comunes, confiando en una prueba para ver si el texto es UTF-16 válido falla: el sistema operativo Windows detectaría erróneamente la frase " Bush hid the facts " (sin un salto de línea) en ASCII como UTF-16LE chino , ya que todos los pares de bytes coincidían con los caracteres Unicode asignados en UTF-16LE.
La detección de conjuntos de caracteres es particularmente poco fiable en Europa, en un entorno con codificaciones ISO-8859 mixtas. Se trata de codificaciones de ocho bits estrechamente relacionadas que comparten una superposición en su mitad inferior con ASCII , y todas las disposiciones de bytes son válidas. No existe una forma técnica de distinguir estas codificaciones, y su reconocimiento depende de la identificación de características lingüísticas, como la frecuencia de las letras o la ortografía.
Debido a la poca fiabilidad de la detección heurística, es mejor etiquetar correctamente los conjuntos de datos con la codificación adecuada (véase Especificación de la codificación de caracteres del documento ). Aunque UTF-8 y UTF-16 son fáciles de detectar, algunos sistemas requieren codificaciones UTF para etiquetar explícitamente el documento con una marca de orden de bytes (BOM) prefijada.
Véase también
- Componentes internacionales para Unicode : una biblioteca que puede realizar la detección de conjuntos de caracteres.
- Identificación de idiomas
- Rastreo de contenido
- El análisis del navegador es una técnica heurística similar para determinar las capacidades de un navegador web antes de servirle contenido.
Notas
- ↑ En una cadena de bytes aleatoria, un byte con el bit más significativo activado tiene solo una probabilidad de 1/15 de iniciar un punto de código UTF-8 válido. Las probabilidades son aún menores en texto real, que no es aleatorio, sino que tiende a contener bytes aislados con el bit más significativo activado, los cuales siempre son inválidos en UTF-8.
Referencias
- 1 2 "PHP: mb_detect_encoding - Manual" . www.php.net . Consultado el 12 de noviembre de 2024 .
- 1 2 Kim, Seung-Ho; Park, Jongsoo (2007). Detección automática de codificación de caracteres y lenguaje (PDF) (Tesis). Universidad de Stanford .
- ↑ King, Ritchie (2012). "¿Será Unicode pronto el código universal? [The Data]". IEEE Spectrum . 49 (7): 60. doi : 10.1109/MSPEC.2012.6221090 .
- ↑ Chen, Raymond (1 de julio de 2019). "Un programa para detectar mojibake que resulta de la mala interpretación de un archivo codificado en UTF-8 como página de códigos 1252" . The Old New Thing . Recuperado el 7 de julio de 2025 .
- 1 2 "Un enfoque compuesto para la detección de lenguaje/codificación" . www-archive.mozilla.org . Recuperado el 12 de noviembre de 2024 .
Enlaces externos
- IMultiLanguage2::DetectarPáginaDeCódigoDeEntrada
- Referencia de la API para la detección de conjuntos de caracteres de ICU
- Referencia para la detección de conjuntos de caracteres de cpdetector
- Detectores de codificación de caracteres de Mozilla
- Versión para Java de los detectores de conjuntos de caracteres de Mozilla
- Versión para Delphi/Pascal de los detectores de conjuntos de caracteres de Mozilla
- uchardet , bifurcación en C++ de Mozilla Charset Detectors; incluye una herramienta de línea de comandos Bash.
- Versión en C# de los detectores de conjuntos de caracteres de Mozilla
- HEBCI, una técnica para detectar el conjunto de caracteres utilizado en los formularios enviados.
- Distribuciones de frecuencia de los trígrafos ingleses
- Codificación de caracteres