Sto cercando di implementare il supporto del testo in Windows con l'intenzione di passare anche a una piattaforma Linux in seguito. Sarebbe ideale supportare le lingue internazionali in modo uniforme, ma ciò non sembra essere facilmente realizzabile considerando le due piattaforme in questione. Ho dedicato molto tempo a leggere UNICODE, UTF-8 (e altre codifiche), widechar e simili ed ecco quello che ho capito finora:UNICODE, UTF-8 e Windows p.
UNICODE, come standard, descrive il set di caratteri che sono mappabili e l'ordine in cui si verificano. Mi riferisco a questo come "cosa": UNICODE specifica quello che sarà disponibile.
UTF-8 (e altre codifiche) specificare come: come ciascun carattere verrà rappresentato in un formato binario.
Ora, su Windows, hanno optato per una codifica UCS-2 in origine, ma non sono riusciti a soddisfare i requisiti, quindi UTF-16 è ciò che hanno, che è anche multi-char quando necessario.
ecco il delemma:
- di Windows internamente solo fa UTF-16, quindi se si desidera supportare i caratteri internazionali si è costretti a convertirsi al loro versioni WideChar di utilizzare il sistema operativo chiede di conseguenza. Non sembra esserci alcun supporto per chiamare qualcosa come CreateFileA() con una stringa UTF-8 multi-byte e farlo sembrare corretto. È corretto?
- In C ci sono alcune funzioni di supporto multibyte (_mbscat, _mbscpy, ecc.), Tuttavia, su Windows, il tipo di carattere è definito come carattere senza segno * per quelle funzioni. Dato che la serie di funzioni _mbs non è un set completo (ad esempio, non esiste _mbstol per convertire una stringa multibyte in una lunga, ad esempio), si è costretti a utilizzare alcune delle versioni char * delle funzioni di runtime, che porta a problemi del compilatore a causa della differenza di tipo firmato/non firmato tra quelle funzioni. Qualcuno ne usa anche quelli? Fai un mucchio di casting per aggirare gli errori?
- In C++, std :: string ha iteratori, ma questi sono basati su char_type, non su punti di codice. Quindi, se faccio un ++ su uno std :: string :: iterator, ottengo il prossimo char_type, non il successivo punto di codice. Allo stesso modo, se si chiama std :: string :: operator [], si ottiene un riferimento a un char_type, che ha il grande potenziale di non essere un punto di codice completo. Quindi, come si fa a scorrere una std :: string per punto di codice? (C ha la funzione _mbsinc()).
Non "multi-byte quando necessario". È solo "multi-byte". Non sai se è "necessario" fino a quando non hai iniziato ad elaborarlo. –
Ecco un [post mio] (http://stackoverflow.com/questions/6300804/wchars-encodings-standards-and-portability) su questo argomento; forse è di tuo interesse. Per (3), converti i tuoi dati in UTF-32 (idealmente memorizzati in un 'char32_t'), e quindi i punti di codice equivalgono agli elementi di stringa. –
E ricorda che ci sono pochi motivi validi per iterare una stringa Unicode per punti di codice, perché un grafo può essere rappresentato da più punti di codice (ognuno dei quali può essere più unità di codice in UTF-8 o UTF-16, ma per molti scopi pratici è lo stesso problema due volte). La normalizzazione è una ragione legittima, la codifica per UTF-8 è un'altra, ma queste sono cose per le quali è comunque possibile utilizzare una libreria. –