c++ - codificaciones - utf-8 encoding
Cómo escribir una cadena std:: en un archivo de texto UTF-8 (8)
¿Cuál es la forma más fácil y sencilla de hacerlo?
El manejo más intuitivo y, por lo tanto, más sencillo de utf8 en C ++ es, sin duda, usar un reemplazo std::string
para std::string
. Como internet aún carece de uno, fui a implementar la funcionalidad por mi cuenta:
tinyutf8 (EDIT: ahora Github).
Esta biblioteca proporciona un std::u32string
muy ligero para std::string
(o std::u32string
si así lo desea, porque itera sobre puntos de código en lugar de caracteres). Ity se implementa con éxito en el medio entre el acceso rápido y el consumo de memoria pequeña, mientras que es muy robusto. Esta robustez de las secuencias UTF8 "no válidas" lo hace (casi completamente) compatible con ANSI (0-255).
¡Espero que esto ayude!
Solo quiero escribir algunas líneas simples en un archivo de texto en C ++, pero quiero que estén codificadas en UTF-8. ¿Cuál es la forma más fácil y sencilla de hacerlo?
En cuanto a UTF-8 es una cadena de caracteres multibite, por lo que tiene algunos problemas para trabajar y es una mala idea. En su lugar, utilice Unicode normal.
Así que, en mi opinión, lo mejor es usar texto de caracteres ASCII ordinario con algún conjunto de codificación. Debe usar Unicode si usa más de 2 conjuntos de diferentes símbolos (idiomas) en una sola.
Es un caso bastante raro. En la mayoría de los casos bastan 2 conjuntos de símbolos. Para este caso común, utilice caracteres ASCII, no Unicode.
El efecto de usar caracteres multibuto como UTF-8 solo obtiene texto tradicional de China, árabe o algunos jeroglíficos. Es un caso muy, muy raro !!!
No creo que haya muchas personas que necesiten eso. ¡¡¡Así que nunca uses UTF-8 !!! Es evitar fuertes dolores de cabeza al manipular tales cuerdas.
Hay una pequeña biblioteca para trabajar con utf8 desde c ++: utfcpp
Si por "simple" quiere decir ASCII, no es necesario realizar ninguna codificación, ya que los caracteres con un valor ASCII de 127 o menos son los mismos en UTF-8.
Utilice Glib::ustring de glibmm .
Es el único contenedor de cadenas UTF-8 (AFAIK). Aunque está basado en glifos (no en bytes), tiene las mismas firmas de métodos que std::string
por lo que el puerto debe ser simple de buscar y reemplazar (solo asegúrese de que sus datos sean UTF-8 válidos antes de cargarlos en una ustring
).
libiconv es una excelente biblioteca para todas nuestras necesidades de codificación y decodificación.
Si está utilizando Windows, puede usar WideCharToMultiByte y especificar que desea UTF8.
La única forma en que UTF-8 afecta a std::string
es que size()
, length()
y todos los índices se miden en bytes, no en caracteres.
Y, como señala sbi, el incremento del iterador provisto por std::string
avanzará por byte, no por carácter, por lo que realmente puede apuntar al centro de un punto de código UTF-8 multibyte. No hay un iterador compatible con UTF-8 en la biblioteca estándar, pero hay algunos disponibles en la ''Red''.
Si recuerdas eso, puedes poner UTF-8 en std::string
, escribirlo en un archivo, etc. de la forma habitual (me refiero a la forma en que usarías std::string
sin UTF-8). dentro).
Es posible que desee iniciar su archivo con una marca de orden de bytes para que otros programas sepan que es UTF-8.
std::wstring text = L"Привет";
QString qstr = QString::fromStdWString(text);
QByteArray byteArray(qstr.toUtf8());
std::string str_std( byteArray.constData(), byteArray.length());