2008-12-18 23 views
14

¿Cuál es la mejor manera de identificar si una cadena (o es) podría ser codificación UTF-8? La API de Win32 IsTextUnicode no es de mucha ayuda aquí. Además, la cadena no tendrá una BOM UTF-8, por lo que no se puede verificar. Y, sí, ya sé que sólo los personajes por encima del rango ASCII se codifican con más de 1 byte.Howto identificar cadenas UTF-8 codificado

+1

¿En qué idioma está intentando esto? –

+0

Realmente no importa - Estoy buscando un método general. Pero si puedes dar algo que funcione para un idioma en particular, entonces por favor entra. –

+0

Y, no encontrarás una lista de materiales al comienzo de una secuencia UTF-8, no tiene sentido ya que UTF-8 es el mismo orden de bytes es. – mat

Respuesta

17

chardet desarrollado por Mozilla utiliza en FireFox. Source code

jchardet es un puerto java de la fuente del algoritmo de detección automático de conjuntos de caracteres de mozilla.

NCharDet es un puerto .Net (C#) de un puerto Java de C++ utilizado en los navegadores Mozilla y FireFox.

Code project C# muestra que utiliza el MLang de Microsoft para la detección de codificación de caracteres.

UTRAC es una herramienta de línea de comandos y una biblioteca escrita en C++ para detectar serie de codificación

cpdetector es una biblioteca de Delphi se utiliza para la codificación de detección de

Otro post útil que apunta a una gran cantidad de bibliotecas para ayudarle a determinar codificación de caracteres http://fredeaker.blogspot.com/2007/01/character-encoding-detection.html

También puede consultar la pregunta relacionada How Can I Best Guess the Encoding when the BOM (Byte Order Mark) is Missing?, tiene algunos contenidos útiles.

6

No hay una manera realmente confiable, pero básicamente, como una secuencia aleatoria de bytes (por ejemplo, una cadena en una codificación estándar de 8 bits) es muy poco probable que sea una cadena UTF-8 válida (si el bit más significativo de un byte activada, hay reglas muy específicas en cuanto a qué tipo de bytes puede seguirlo en UTF-8), puede intentar decodificar la cadena como UTF-8 y considerar que es UTF-8 si no hay errores de decodificación.

determinar si hubo errores de descodificación es otro problema por completo, muchas bibliotecas Unicode simplemente reemplazar caracteres no válidos con un signo de interrogación sin indicar si se produjo o no un error. Por lo tanto, necesita una forma explícita de determinar si se produjo un error durante la decodificación o no.

5

This W3C page tiene una expresión regular de Perl para la validación de detección de conjunto de caracteres UTF-8

+0

Si está leyendo una secuencia y es posible que no tenga el comienzo, debe perder el \ A al principio o agregar un ". {0,5}?" justo después para capturar el primer carácter truncado. – mat

+1

Recomiendo hacer esto usando la biblioteca Unicode estándar del idioma en lugar de volver a implementarla a través de expresiones regulares. – Laurent

1

Para realizar la detección de carácter en rubí instalar el 'Chardet' joya

sudo gem install chardet 

He aquí un pequeño script de rubí para funcionar Chardet sobre el flujo de entrada estándar.

require "rubygems" 
require 'UniversalDetector' #chardet gem 
infile = $stdin.read() 
p UniversalDetector::chardet(infile) 

Chardet da salida a una conjetura en la codificación de conjunto de caracteres y también un nivel de confianza (0-1) a partir de su análisis estadístico

biblioteca independiente

see also this snippet

1

C/C++ basado en detector conjunto de caracteres de Mozilla

https://github.com/batterseapower/libcharsetdetect

Detector universal de conjuntos de caracteres (UCSD) Una biblioteca que expone una interfaz C y una interfaz libre de dependencia a la biblioteca UCSD de Mozilla C++. Esta biblioteca proporciona un conjunto de heurísticas de gran precisión que intentan determinar el conjunto de caracteres utilizado para codificar algunos textos de entrada. Esto es extremadamente útil cuando su programa tiene que manejar un archivo de entrada que se suministra sin ningún metadato de codificación.

0

No se ha especificado un idioma, pero en PHP puede utilizar mb_check_encoding

if(mb_check_encoding($yourDtring, 'UTF-8')) 
    { 
    //the string is UTF-8 
    } 
    else 
    { 
     //string is not UTF-8 
    } 
2

En Windows, puede utilizar MultiByteToWideChar() con la página de códigos CP_UTF8 y la bandera MB_ERR_INVALID_CHARS. Si la función falla, la cadena no es válida UTF-8.

2

para Win32, puede utilizar la API de mlang, esto es parte de Windows y apoyado desde Windows XP, lo bueno de esto es que se le da estadísticas de la probabilidad de la entrada es de estar en una codificación particular:

CComPtr<IMultiLanguage2> lang; 
HRESULT hr = lang.CoCreateInstance(CLSID_CMultiLanguage, NULL, CLSCTX_INPROC_SERVER); 
char* str = "abc"; // EF BB BF 61 62 63 
int size = 6; 
DetectEncodingInfo encodings[100]; 
int encodingsCount = 100; 
hr = lang->DetectInputCodepage(MLDETECTCP_NONE, 0, str, &size, &encodings, &encodingsCount);