2010-01-13 13 views
9

Ricevo l'input della console dall'utente e desidero codificarlo su UTF-8. La mia comprensione è che il C++ non ha una codifica standard per i flussi di input e che invece dipende dal compilatore, dall'ambiente di runtime, dalla localizzazione e da cosa no.Determinare la codifica dell'input esaminando i byte di input

Come è possibile determinare la codifica dell'input esaminando i byte dell'ingresso?

risposta

3

In generale, non è possibile. Se sparo un flusso di byte generati casualmente nella tua app come può determinare la loro "codifica"? Devi semplicemente specificare che la tua applicazione accetta determinate codifiche, o fare una supposizione che ciò che il sistema operativo ti mette sarà opportunamente codificato.

+0

Per costruire su questo, è possibile utilizzare l'ambiente per determinare un valore predefinito. Dai un'occhiata a $ LANG e al comando locale, se il tuo sistema operativo li supporta. –

2

In genere, controllare se l'input è UTF è una questione di euristica - non esiste un algoritmo definitivo che indichi "sì/no". Più complessa è l'euristica, meno falsi positivi/negativi si otterranno, tuttavia non esiste un modo "sicuro".

Per un esempio di euristica è possibile controllare questa libreria: 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); 
} 

è possibile usarlo, o controllare le sue fonti come hanno fatto.

+0

Nota: questo ti dice se POTREBBE essere utf8, non puoi sapere se lo è. Un flusso di ASCII a 7 bit regolari è utf8 fino a quando non si preme il primo carattere accentato. –

+1

* Controllare * se l'input è valido UTF-8 o no non è euristico (è ciò che fa la funzione), ma determinare se UTF-8 era l'intenzione * dell'utente *. –

+0

Scelta rapida lingua: / –

0

Utilizzare i mezzi del sistema operativo integrato. Quelli variano da un sistema operativo all'altro. Su Windows, è sempre meglio utilizzare le API WideChar e non pensare affatto alla codifica.

E se l'input proviene da un file, al contrario di una vera console, tutte le scommesse sono disattivate.

0

Jared Oberhaus ha risposto bene a uno related question specifico per java.

Fondamentalmente ci sono alcuni passaggi da seguire per fare un'ipotesi ragionevole, ma alla fine si tratta solo di congetture senza un'indicazione esplicita. (Da qui il famoso indicatore BOM nei file UTF-8)

0

Come già detto in risposta allo question John Weldon has pointed to, ci sono un certo numero di librerie che eseguono il riconoscimento della codifica dei caratteri. Puoi anche dare un'occhiata alla sorgente del comando unix file e vedere quali test usa per determinare la codifica del file. Dalla pagina man di file:

ASCII, ISO-8859-x, i set di caratteri ASCII estesi non-ISO a 8 bit (come quelli utilizzati su sistemi PC Macintosh e IBM), UTF-8-encoded I set di caratteri Unicode, UTF-16 codificati Unicode ed EBCDIC possono essere distinti dai diversi intervalli e sequenze di byte che costituiscono testo stampabile in ciascun set.

PCRE fornisce una funzione per verificare una determinata stringa per il suo UTF-8 completamente valido.

Problemi correlati