Unicode UTF-8 en C++
J'ai beaucoup cherché, mais impossible de trouver quoi que ce soit:
unsigned int unicodeChar = 0x5e9;
unsigned int utf8Char;
uni2utf8(unicodeChar, utf8Char);
assert(utf8Char == 0xd7a9);
Est-il une bibliothèque (de préférence boost) qui met en œuvre quelque chose de semblable à uni2utf8?
Pour le c++11 unicode littéraux de chaîne, voir stackoverflow.com/questions/6796157/...
Ce que vous demandez n'a pas de sens et ne peut pas travailler. Il n'y a pas une telle chose comme un des caractères UTF-8. Il y a de l'UTF-8 unités de code, qui sont de 8 bits de valeurs que lorsqu'ils sont correctement décodées forme Unicode codepoint. Mais UTF-8 unités de code sont pas stockée dans
1. UTF8 unicode 2. utilisation nowide.
utf8 n'est pas Unicode, utf8 est une méthode pour représenter les nombres. unicode sur l'autre main est une correspondance entre les symboles des chiffres. Nombres abstraits, pas de leur représentation.
Ce que vous demandez n'a pas de sens et ne peut pas travailler. Il n'y a pas une telle chose comme un des caractères UTF-8. Il y a de l'UTF-8 unités de code, qui sont de 8 bits de valeurs que lorsqu'ils sont correctement décodées forme Unicode codepoint. Mais UTF-8 unités de code sont pas stockée dans
unsigned int
s de 32-bits. Chaque unité de code est de 8 bits; par conséquent, la façon de stocker une Unicode codepoint en UTF-8 est comme une séquence d'unités de code. Un string, pas un entier.1. UTF8 unicode 2. utilisation nowide.
utf8 n'est pas Unicode, utf8 est une méthode pour représenter les nombres. unicode sur l'autre main est une correspondance entre les symboles des chiffres. Nombres abstraits, pas de leur représentation.
OriginalL'auteur Ezra | 2012-07-22
Vous devez vous connecter pour publier un commentaire.
Coup de pouce.Paramètres régionaux a également des fonctions de conversions d'encodage:
OriginalL'auteur Philipp
Conversions Unicode font partie de C++11:
Oui, il ya de Stimuler.Locale, j'ai ajouté une autre réponse.
Vous n'avez pas besoin codecvt_utf8.
codecvt<char32_t,char,std::mbstate>
convertit entre le format UTF-32 et de l'UTF-8, etcodecvt<char16_t,char,std::mbstate>
convertit entre le format UTF-16 et UTF-8.Je soupçonne fortement que ne fonctionne que si
char
est nativement en UTF-8. E. g. Linux, mais pas Windows.Trois raisons de préférer
codecvt_utf8
(au moins en conjonction avecwstring_convert
): 1. Il contient le motutf8
, donc c'est plus clair pour le lecteur ce qui se passe. 2. C'est plus courte (moins d'arguments de modèle requis). 3.codecvt
a protégé destructeur et n'est donc pas utilisable comme une baisse-dans le remplacement pourcodecvt_utf8
. Si vous utilisezwstring_convert
, vous avez besoin de C++11 de toute façon, il faut donc toujours avoircodecvt_utf8
à votre disposition. Je ne vois pas beaucoup de valeur à l'aide decodecvt
ici.OriginalL'auteur Philipp
Vous pourriez vouloir essayer UTF8-RPC bibliothèque. Codage de caractères Unicode avec il devrait ressembler à ceci:
std::string
est utilisé ici comme un conteneur pour les octets UTF-8.unicodeChar
est encodé en UTF-32? Autant que je sache, "large de chaînes" dans le C et le C++ ont indéterminée, opaque "système de codage" qui pourrait être n'importe quoi. Vous avais d'abord besoin de convertir votre grande chaîne UTF-32 en utilisant quelque chose commeiconv
.Me voyez-vous à l'aide de matières C à l'échelle des chaînes, seule ou en conjonction avec plate-forme de mise en œuvre de
std::wstring
?Oui, vous dites
L
!Ai-je oublié de "cuisiner" des matières à l'échelle de la chaîne avec
std::wstring
, qui sait très bien comment ces chaînes devraient être traitées sur la plate-forme actuelle/compilateur?Que pensez-vous
wstring
est? C'est juste un conteneur dewchar_t
s, et l'initialisation de ceux du marais-standard grande chaîne littérale. Où est la "cuisson"?OriginalL'auteur Desmond Hume
Utilisation sprintf. (:
cstring = sprintf("%S", unicodestring);
OriginalL'auteur iDomo