C++ & Boost: encoder / decode UTF-8
j'essaie de faire une tâche très simple: prendre conscience d'unicode wstring
et la convertir en une string
, encodé en octets UTF8, et puis le chemin inverse: prendre un string
contenant des octets UTF8 et convertissez-les en Unicode-aware wstring
.
le problème est que j'en ai besoin sur plusieurs plateformes et J'en ai besoin pour travailler avec Boost... et je n'arrive pas à trouver un moyen de le faire fonctionner. J'ai pensé
- http://www.edobashira.com/2010/03/using-boost-code-facet-for-reading-utf8.html et
- http://www.boost.org/doc/libs/1_46_0/libs/serialization/doc/codecvt.html
essayer de convertir le code pour utiliser stringstream
/wstringstream
au lieu des fichiers de n'importe quoi, mais rien ne semble fonctionner.
par exemple, en Python cela ressemblerait à cela:
>>> u"שלום"
u'u05e9u05dcu05d5u05dd'
>>> u"שלום".encode("utf8")
'xd7xa9xd7x9cxd7x95xd7x9d'
>>> 'xd7xa9xd7x9cxd7x95xd7x9d'.decode("utf8")
u'u05e9u05dcu05d5u05dd'
ce que je suis finalement après est ceci:
wchar_t uchars[] = {0x5e9, 0x5dc, 0x5d5, 0x5dd, 0};
wstring ws(uchars);
string s = encode_utf8(ws);
// s now holds "xd7xa9xd7x9cxd7x95xd7x9d"
wstring ws2 = decode_utf8(s);
// ws2 now holds {0x5e9, 0x5dc, 0x5d5, 0x5dd}
Je ne veux vraiment pas ajouter une autre dépendance à L'Unité de soins intensifs ou quelque chose dans cet esprit... mais à ma connaissance, cela devrait être possible avec Boost.
un exemple de code serait grandement apprécié! Merci
4 réponses
Thanks everyone, but ultimately I restored to http://utfcpp.sourceforge.net/ -- c'est une bibliothèque d'en-tête qui est très légère et facile à utiliser. Je partage un code de démonstration ici, si quelqu'un le trouve utile:
inline void decode_utf8(const std::string& bytes, std::wstring& wstr)
{
utf8::utf8to32(bytes.begin(), bytes.end(), std::back_inserter(wstr));
}
inline void encode_utf8(const std::wstring& wstr, std::string& bytes)
{
utf8::utf32to8(wstr.begin(), wstr.end(), std::back_inserter(bytes));
}
Utilisation:
wstring ws(L"\u05e9\u05dc\u05d5\u05dd");
string s;
encode_utf8(ws, s);
il y a déjà un lien boost dans les commentaires, mais dans le C++0x presque standard, il y a wstring_convert
cela
#include <iostream>
#include <string>
#include <locale>
#include <codecvt>
int main()
{
wchar_t uchars[] = {0x5e9, 0x5dc, 0x5d5, 0x5dd, 0};
std::wstring_convert<std::codecvt_utf8<wchar_t>> conv;
std::string s = conv.to_bytes(uchars);
std::wstring ws2 = conv.from_bytes(s);
std::cout << std::boolalpha
<< (s == "\xd7\xa9\xd7\x9c\xd7\x95\xd7\x9d" ) << '\n'
<< (ws2 == uchars ) << '\n';
}
sortie lorsqu'il est compilé avec MS Visual Studio 2010 EE SP1 ou avec CLang++ 2.9
true
true
coup de pouce.Locale est sorti en Boost 1.48 (15 novembre 2011) ce qui facilite la conversion de et vers UTF8 / 16
voici quelques exemples pratiques tirés des documents:
string utf8_string = to_utf<char>(latin1_string,"Latin1");
wstring wide_string = to_utf<wchar_t>(latin1_string,"Latin1");
string latin1_string = from_utf(wide_string,"Latin1");
string utf8_string2 = utf_to_utf<char>(wide_string);
Presque aussi facile que Python de codage/décodage :)
notez ce Boost.Locale n'est pas une bibliothèque d'en-tête seulement.
baisse-dans le remplacementstd::string
/std::wstring
qui gère l'utf-8, voir TINYUTF8.
En combinaison avec <codecvt>
vous pouvez convertir à peu près de/vers chaque encodage de/vers utf8, que vous manipulez ensuite à travers la bibliothèque ci-dessus.