UTF-16 codecvt sfaccettatura
Domanda
L'estensione di questo domande su locali
E descritto in questa domanda : Quello che volevo fare era installare una sfaccettatura codecvt nel locale che comprende i file UTF-16.
ho potuto scrivere il mio. Ma io non sono un esperto di UTF e come tale sono sicuro che avrei avuto quasi corretto; ma si spezzerebbe al momento più inopportuno. Così mi chiedevo se ci sono delle risorse (sul web) di pre-compilazione codecvt (o altro) sfaccettature che possono essere utilizzati da C ++ che sono peer reviewed e testati?
Il motivo è l'impostazione internazionale predefinita (sul mio sistema Mac OS X 10.6) durante la lettura di un file solo converte 1 byte a 1 wchar_t senza alcuna conversione. Così UTF-16 file codificati vengono convertiti in wstrings che contengono un sacco di nullo ( '\ 0') caratteri.
Soluzione
Non sono sicuro se per "risorse sul Web" si intendono disponibili gratuitamente, ma v'è la Dinkumware Conversioni Biblioteca che suona come si adatta alle vostre esigenze, a condizione che la biblioteca può essere integrato in vostra suite compilatore.
I tipi codecvt
sono descritti nella sezione Codice conversioni .
Altri suggerimenti
Al C ++ 11, ci sono ulteriori specializzazioni codecvt
standard e tipi, destinati per la conversione tra vari UTF- x e UCS x sequenze di caratteri; uno di questi può soddisfare le vostre esigenze.
In <locale>
:
-
std::codecvt<char16_t, char, std::mbstate_t>
: Converte tra UTF-16 e UTF-8 .
-
std::codecvt<char32_t, char, std::mbstate_t>
: Converte tra UTF-32 e UTF-8 .
In <codecvt>
:
-
std::codecvt_utf8_utf16<typename Elem>
: Conversione di UTF-8 e UTF-16, dove UTF-16 punti di codice vengono memorizzati comeElem
specificato (si noti che se viene specificatochar32_t
, un solo punto di codice memorizzate alchar32_t
).- Ha due supplementari, paramters in default template (
unsigned long MaxCode = 0x10ffff
, estd::codecvt_mode Mode = (std::codecvt_mode)0
), ed eredita dastd::codecvt<Elem, char, std::mbstate_t>
.
- Ha due supplementari, paramters in default template (
-
std::codecvt_utf8<typename Elem>
: Converte tra UTF-8 e sia UCS2 o UCS4, a secondaElem
(UCS2 perchar16_t
, UCS4 perchar32_t
, dipendente dalla piattaforma perwchar_t
).- Ha due supplementari, paramters in default template (
unsigned long MaxCode = 0x10ffff
, estd::codecvt_mode Mode = (std::codecvt_mode)0
), ed eredita dastd::codecvt<Elem, char, std::mbstate_t>
.
- Ha due supplementari, paramters in default template (
-
std::codecvt_utf16<typename Elem>
: Converte tra UTF-16 e uno o UCS2 UCS4, a secondaElem
(UCS2 perchar16_t
, UCS4 perchar32_t
, dipendente dalla piattaforma perwchar_t
).- Ha due supplementari, paramters in default template (
unsigned long MaxCode = 0x10ffff
, estd::codecvt_mode Mode = (std::codecvt_mode)0
), ed eredita dastd::codecvt<Elem, char, std::mbstate_t>
.
- Ha due supplementari, paramters in default template (
codecvt_utf8
e codecvt_utf16
convertirà tra l'UTF specificato e sia UCS2 o UCS4, a seconda delle dimensioni del Elem
. Pertanto, wchar_t
specificherà UCS2 sui sistemi in cui è 16- a 31-bit (come Windows, dove è a 16 bit), o UCS4 sui sistemi in cui è almeno 32 bit (come Linux, dove è 32-bit), indipendentemente dal fatto stringhe wchar_t
effettivamente utilizzare la stessa codifica; su piattaforme che utilizzano diverse codifiche per archi wchar_t
, questo sarà comprensibilmente causare problemi se non si sta attenti.
Per ulteriori informazioni, vedere CPP Riferimento:
Si noti che il supporto per intestazione codecvt
è stato aggiunto solo per libstdc++
tempi relativamente recenti. Se si utilizza una versione precedente di Clang o di GCC, potrebbe essere necessario utilizzare libc++
, se si desidera utilizzarlo.
Si noti che le versioni di Visual Studio precedenti al 2015 in realtà non supportano char16_t
e char32_t
; se esistono questi tipi precedenti versioni, sarà come typedef rispettivamente per unsigned short
e unsigned int
,. Si noti inoltre che le vecchie versioni di Visual Studio possono avere problemi conversione di stringhe tra codifiche UTF volte, e che Visual Studio 2015 ha un problema tecnico che impedisce codecvt
da lavorare correttamente con char16_t
e char32_t
, richiedendo l'uso di tipi integrali stesse dimensioni invece