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é

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

21
demandé sur sebulba 2011-05-26 18:27:25

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);
23
répondu sebulba 2011-05-27 17:07:11

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
18
répondu Cubbi 2011-05-26 15:00:09

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.

11
répondu Diaa Sami 2012-10-09 10:09:15

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.

2
répondu Jakob Riedle 2018-04-09 08:12:11