2010-01-13 17 views
9

Recibo la entrada de la consola del usuario y deseo codificarla en UTF-8. Según tengo entendido, C++ no tiene una codificación estándar para las secuencias de entrada, y en su lugar depende del compilador, el entorno de ejecución, la localización y lo que no.Determine la codificación de entrada examinando los bytes de entrada

¿Cómo puedo determinar la codificación de entrada examinando los bytes de la entrada?

Respuesta

3

En general, no se puede. Si disparo una secuencia de bytes generados aleatoriamente en su aplicación, ¿cómo puede determinar su "codificación"? Simplemente tiene que especificar que su aplicación acepta ciertas codificaciones, o suponer que lo que el sistema operativo le dé será codificado adecuadamente.

+0

Para seguir con esto, puede usar el entorno para determinar un valor predeterminado razonable. Eche un vistazo a $ LANG y el comando de configuración regional, si su sistema operativo los admite. –

2

En general, comprobar si la entrada es UTF es una cuestión de heurística; no hay un algoritmo definitivo que indique "sí/no". Cuanto más compleja sea la heurística, menos falsos positivos/negativos obtendrá, sin embargo, no hay una manera "segura".

Para un ejemplo de la heurística se puede extraer de esta biblioteca: http://utfcpp.sourceforge.net/

bool valid_utf8_file(iconst char* file_name) 
{ 
    ifstream ifs(file_name); 
    if (!ifs) 
     return false; // even better, throw here 

    istreambuf_iterator<char> it(ifs.rdbuf()); 
    istreambuf_iterator<char> eos; 

    return utf8::is_valid(it, eos); 
} 

También se puede usar, o comprobar sus fuentes de la forma en que lo han hecho.

+0

Nota: esto le dice que si PODRÍA ser utf8, no puede saber si lo es. Una corriente de ASCII de 7 bits regular es utf8 hasta que toques el primer carácter acentuado. –

+1

* Comprobar * si la entrada es válida UTF-8 o no no es heurística (es lo que hace su función), pero determinar si UTF-8 era la intención * del usuario * es. –

+0

Atajo de idioma: / –

0

Utilice el sistema operativo integrado. Esos varían de un sistema operativo a otro. En Windows, siempre es mejor usar las API WideChar y no pensar en la codificación en absoluto.

Y si su entrada proviene de un archivo, a diferencia de una consola real, entonces todas las apuestas están desactivadas.

0

Jared Oberhaus respondió esto bien en un related question específico para java.

Básicamente hay algunos pasos que puede tomar para hacer una suposición razonable, pero en última instancia, es solo una suposición sin indicación explícita. (De ahí el (famoso) marcador BOM en archivos UTF-8)

0

Como ya se ha dicho en respuesta al question John Weldon has pointed to, hay una serie de bibliotecas que realizan reconocimiento de codificación de caracteres. También puede echar un vistazo a la fuente del comando unix file y ver qué pruebas utiliza para determinar la codificación del archivo. Desde la página del manual de file:

ASCII, ISO-8859-x, ISO no de 8 bits juegos de caracteres de ASCII extendido (como los utilizados en los sistemas Macintosh y PC de IBM), UTF-8-codificada Los conjuntos de caracteres Unicode, Unicode codificado en UTF-16 y EBCDIC se pueden distinguir por los diferentes rangos y secuencias de bytes que constituyen texto imprimible en cada conjunto.

PCRE proporciona una función para probar una cadena dada para su UTF-8 completamente válido.

Cuestiones relacionadas