tratados son publico privado los internacional importancia elementos efectos diplomatico desarrollo derivados derecho cuáles comision codificación codificacion c++ boost unicode utf-8

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

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);


Para un reemplazo std::wstring para std::string / std::wstring que maneja utf8, vea TINYUTF8 .

En combinación con <codecvt> puede convertir prácticamente todas las codificaciones de / a utf8, que luego maneja a través de la biblioteca anterior.


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