c++ string utf-8 wstring

c++ - Convertir wstring a cadena codificada en UTF-8



(6)

Necesito convertir entre cadenas y cadenas. Me di cuenta de que el uso de facetas codecvt debería hacer el truco, pero no parece funcionar para la configuración regional utf-8.

Mi idea es que cuando leo el archivo codificado utf-8 a caracteres, un carácter utf-8 se lee en dos caracteres normales (que es cómo funciona utf-8). Me gustaría crear esta cadena utf-8 a partir de la representación wstring para la biblioteca que uso en mi código.

¿Alguien sabe cómo hacerlo?

Ya probé esto:

locale mylocale("cs_CZ.utf-8"); mbstate_t mystate; wstring mywstring = L"čřžýáí"; const codecvt<wchar_t,char,mbstate_t>& myfacet = use_facet<codecvt<wchar_t,char,mbstate_t> >(mylocale); codecvt<wchar_t,char,mbstate_t>::result myresult; size_t length = mywstring.length(); char* pstr= new char [length+1]; const wchar_t* pwc; char* pc; // translate characters: myresult = myfacet.out (mystate, mywstring.c_str(), mywstring.c_str()+length+1, pwc, pstr, pstr+length+1, pc); if ( myresult == codecvt<wchar_t,char,mbstate_t>::ok ) cout << "Translation successful: " << pstr << endl; else cout << "failed" << endl; return 0;

que devuelve ''error'' para la configuración regional cs_CZ.utf-8 y funciona correctamente para la configuración regional cs_CZ.iso8859-2.


¿Cuál es tu plataforma? Tenga en cuenta que Windows no admite las configuraciones regionales UTF-8, por lo que esto puede explicar por qué está fallando.

Para hacer esto de una manera dependiente de la plataforma, puede usar MultiByteToWideChar / WideCharToMultiByte en Windows e iconv en Linux. Es posible que pueda usar un poco de magia mágica para hacer esto de manera independiente de la plataforma, pero no lo he probado yo mismo, así que no puedo agregar sobre esta opción.


C ++ no tiene idea de Unicode. Utilice una biblioteca externa como ICU ( clase UnicodeString ) o Qt ( clase QString ), ambas compatibles con Unicode, incluido UTF-8.


El siguiente código podría ayudarte :)

#include <codecvt> #include <string> // convert UTF-8 string to wstring std::wstring utf8_to_wstring (const std::string& str) { std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv; return myconv.from_bytes(str); } // convert wstring to UTF-8 string std::string wstring_to_utf8 (const std::wstring& str) { std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv; return myconv.to_bytes(str); }


La biblioteca Lexertl tiene un iterador que te permite hacer esto:

std::string str; str.assign( lexertl::basic_utf8_out_iterator<std::wstring::const_iterator>(wstr.begin()), lexertl::basic_utf8_out_iterator<std::wstring::const_iterator>(wstr.end()));


Lo que hace la configuración regional es que proporciona información al programa sobre la codificación externa, pero suponiendo que la codificación interna no haya cambiado. Si desea generar UTF-8, debe hacerlo desde wchar_t no desde char* .

Lo que podría hacer es emitirlo como datos sin procesar (no como una cadena), luego debe interpretarse correctamente si la configuración regional del sistema es UTF-8.

Además, cuando utilice (w)cout / (w)cerr / (w)cin , debe imbuir la configuración regional en la transmisión.


Puede usar el convertidor utf_to_utf de boost para obtener el formato char para almacenar en std :: string.

std::string myresult = boost::locale::conv::utf_to_utf<char>(mywstring);