2011-09-23 13 views
5

Dada una cadena en forma de puntero a una matriz de bytes (caracteres), ¿cómo puedo detectar la codificación de la cadena en C/C++ (utilicé Visual Studio 2008)? ? Hice una búsqueda, pero la mayoría de las muestras se hacen en C#.Detectar codificación de una cadena en C/C++

Gracias

+0

¿Esto solo es ANSI vs UCS2? –

+0

¿Cuáles son las posibles codificaciones que esperas? ¿Hay una pequeña colección de posibles, o podría ser cualquiera? –

+0

¿Qué entorno estás usando? Creo que hay una biblioteca para hacer esto en Linux que es portátil para Windows. –

Respuesta

6

Suponiendo que conocen la longitud de la matriz de entrada, que puede hacer las siguientes suposiciones:

  1. En primer lugar, compruebe si los primeros bytes coincide con ninguna bien saben byte order marks (BOM) for Unicode. Si lo hacen, ¡terminaste!
  2. A continuación, busque '\ 0' antes del último byte. Si encuentra uno, podría estar lidiando con UTF-16 o UTF-32. Si encuentra varios '\ 0' consecutivos, probablemente sea UTF-32.
  3. Si cualquier carácter es de 0x80 a 0xff, ciertamente no es ASCII o UTF-7. Si restringe su entrada a alguna variante de Unicode, puede suponer que es UTF-8. De lo contrario, debe hacer algunas conjeturas para determinar cuál es multi-byte character set. Eso no será divertido.
  4. En este punto es: ASCII, UTF-7, Base64 o rangos de UTF-16 o UTF-32 que simplemente no usan el bit superior y no tienen ningún carácter nulo.
3

No es un problema fácil de resolver, y generalmente se basa en métodos heurísticos para tomar una mejor respuesta a lo que la codificación de entrada es, que puede ser disparado por los insumos relativamente inocuos - por ejemplo, echar un vistazo a this Wikipedia article y The Notepad file encoding Redux para más detalles.

Si está buscando una solución solo para Windows con dependencias mínimas, puede usar una combinación de IsTextUnicode y MLang's DetectInputCodePage para intentar la detección de conjuntos de caracteres.

Si está buscando la portabilidad, pero no le importa asumir una dependencia bastante grande en forma de UCI, puede hacer uso de sus rutinas character set detection para lograr lo mismo de forma portátil.

Cuestiones relacionadas