versiones que norma hace ejemplos dato como codigo codifica carácter caracteres c++ string unicode utf-8

c++ - norma - que hace unicode



std:: string y codificación Unicode UTF-8 (3)

Si lo entiendo bien, es posible usar tanto string como wstring para almacenar texto UTF-8.

  • Con char, los caracteres ASCII toman un solo byte, algunos caracteres chinos toman 3 o 4, etc. Lo que significa que str[3] no apunta necesariamente al 4to personaje.

  • Con wchar_t mismo, pero la cantidad mínima de bytes utilizados por caracteres es siempre 2 (en lugar de 1 para caracteres), y un carácter de 3 o 4 bytes tendrá 2 wchar_t .

Correcto ?

Entonces, ¿qué string::find_first_of() si quiero usar string::find_first_of() o string::compare() , etc. con una cadena tan extrañamente codificada? Funcionará ? ¿La clase de cadena maneja el hecho de que los caracteres tienen un tamaño variable? ¿O debería usarlos solo como matrices ficticias sin bytes, en cuyo caso prefiero un wchar_t[] ?

If std::string no maneja eso, segunda pregunta: ¿hay bibliotecas que proporcionen clases de cadena que puedan manejar esa codificación UTF-8 para que str[3] realmente apunte al tercer carácter (que sería una matriz de bytes de longitud 1 para 4) ?


Estás en lo correcto para aquellos:
... Lo que significa que str [3] no apunta necesariamente al 4º personaje ... solo los usa como matrices de bytes sin función ficticia ...

la cadena de C ++ solo puede manejar caracteres ascii. Esto es diferente de la Cadena de Java, que puede manejar caracteres Unicode. Puede almacenar los resultados de codificación (bytes) de caracteres chinos en cadena (char en C / C ++ es solo un byte), pero esto no tiene sentido ya que cadena solo trata los bytes como caracteres ascii, por lo que no puede usar la función de cadena para procesarlo.
wstring puede ser algo que necesitas.

Hay algo que debe aclararse. UTF-8 es solo un método de codificación para caracteres Unicode (transformación de caracteres de / a formato de byte).


No puede manejar Unicode con std :: string o cualquier otra herramienta de la biblioteca estándar. Use una biblioteca externa como: http://utfcpp.sourceforge.net/


Estás hablando de Unicode. Unicode usa 32 bits para representar un personaje. Sin embargo, como eso es una pérdida de memoria, hay codificaciones más compactas. UTF-8 es una de esas codificaciones. Supone que está utilizando unidades de bytes y asigna caracteres Unicode a 1, 2, 3 o 4 bytes. UTF-16 es otro que usa palabras como unidades y asigna caracteres Unicode a 1 o 2 palabras (2 o 4 bytes). Puede usar ambas codificaciones con string y wchar_t. UTF-8 tiende a ser más compacto para texto / números en inglés.

Algunas cosas funcionarán independientemente de la codificación y el tipo utilizado (comparar). Sin embargo, todas las funciones que necesitan para comprender un personaje se romperán. Es decir, el quinto carácter no siempre es la quinta entrada en el conjunto subyacente. Puede parecer que funciona con ciertos ejemplos, pero eventualmente se romperá. string :: compare funcionará, pero no espere obtener el orden alfabético. Eso es dependiente del idioma string :: find_first_of funcionará para algunos, pero no para todos. La cadena larga probablemente funcionará solo porque son largas, mientras que las más cortas pueden confundirse por la alineación de caracteres y generar errores muy difíciles de encontrar.

Lo mejor es encontrar una biblioteca que lo maneje e ignorar el tipo debajo (a menos que tenga razones sólidas para elegir una u otra).