son - C++ & Boost: codifica/decodifica UTF-8
elementos de los tratados (4)
wstring
hacer una tarea muy sencilla: tomar una wstring
unicode y convertirla en una string
, codificada como bytes UTF8, y luego al revés: tomar una string
contenga bytes UTF8 y convertirla en wstring
unicode .
El problema es que lo necesito multiplataforma y necesito que funcione con Boost ... y parece que no puedo encontrar la manera de hacerlo funcionar. He estado jugando con
- http://www.edobashira.com/2010/03/using-boost-code-facet-for-reading-utf8.html y
- http://www.boost.org/doc/libs/1_46_0/libs/serialization/doc/codecvt.html
Intentando convertir el código para usar stringstream
/ wstringstream
lugar de archivos de lo que sea, pero nada parece funcionar.
Por ejemplo, en Python se vería así:
>>> u"שלום"
u''/u05e9/u05dc/u05d5/u05dd''
>>> u"שלום".encode("utf8")
''/xd7/xa9/xd7/x9c/xd7/x95/xd7/x9d''
>>> ''/xd7/xa9/xd7/x9c/xd7/x95/xd7/x9d''.decode("utf8")
u''/u05e9/u05dc/u05d5/u05dd''
Lo que finalmente estoy buscando es esto:
wchar_t uchars[] = {0x5e9, 0x5dc, 0x5d5, 0x5dd, 0};
wstring ws(uchars);
string s = encode_utf8(ws);
// s now holds "/xd7/xa9/xd7/x9c/xd7/x95/xd7/x9d"
wstring ws2 = decode_utf8(s);
// ws2 now holds {0x5e9, 0x5dc, 0x5d5, 0x5dd}
Realmente no quiero agregar otra dependencia en la ICU o algo con ese espíritu ... pero, a mi entender, debería ser posible con Boost.
¡Algún código de muestra sería muy apreciado! Gracias
Boost.Locale se lanzó en Boost 1.48 (15 de noviembre de 2011), lo que facilita la conversión desde y hacia UTF8 / 16.
Aquí hay algunos ejemplos convenientes de los documentos:
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);
Casi tan fácil como codificar / decodificar Python :)
Tenga en cuenta que Boost.Locale no es una biblioteca de solo encabezado.
Gracias a todos, pero finalmente recurrí a http://utfcpp.sourceforge.net/ - es una biblioteca de solo encabezado que es muy liviana y fácil de usar. Estoy compartiendo un código de demostración aquí, si alguien lo encuentra útil:
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));
}
Uso:
wstring ws(L"/u05e9/u05dc/u05d5/u05dd");
string s;
encode_utf8(ws, s);
Ya hay un enlace de impulso en los comentarios, pero en el C ++ 0x casi estándar, hay wstring_convert
que hace esto
#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'';
}
salida cuando se compila con MS Visual Studio 2010 EE SP1 o con CLang ++ 2.9
true
true