son sangre que minerales los extrae como coltan c++ utf-8 c++11 literals string-literals

c++ - sangre - como se extrae el coltan



Es el literal de la cadena u8 necesario en C++ 11 (4)

El compilador elige una codificación nativa natural para la plataforma. En los sistemas POSIX típicos, probablemente elegirá ASCII y algo posiblemente dependiendo de la configuración del entorno para valores de caracteres fuera del rango ASCII. En mainframes probablemente elegirá EBCDIC. La comparación de las cadenas recibidas, por ejemplo, desde archivos o la línea de comandos probablemente funcionará mejor con el conjunto de caracteres nativos. Sin embargo, cuando procesa archivos codificados explícitamente con UTF-8, probablemente sea mejor usar las u8"..." .

Dicho esto, con los cambios recientes relacionados con las codificaciones de caracteres, se rompió una suposición fundamental del procesamiento de cadenas en C y C ++: cada objeto de carácter interno ( char , wchar_t , etc.) utilizado para representar un carácter. Claramente, esto ya no es cierto para una cadena UTF-8 cuando cada objeto de carácter solo representa un byte de algún carácter. Como resultado, todas las funciones de manipulación de cadenas, clasificación de caracteres, etc. no funcionarán necesariamente en estas cadenas. No tenemos ninguna buena biblioteca en fila para tratar con tales cadenas para su inclusión en el estándar.

De Wikipedia :

Con el fin de mejorar el soporte para Unicode en compiladores de C ++, la definición del tipo char se ha modificado para que tenga al menos el tamaño necesario para almacenar una codificación de ocho bits de UTF-8.

Me pregunto qué significa exactamente esto para escribir aplicaciones portátiles. ¿Hay alguna diferencia entre escribir esto?

const char[] str = "Test String";

¿o esto?

const char[] str = u8"Test String";

¿Hay alguna razón para no usar este último para cada cadena literal en su código?

¿Qué sucede cuando hay caracteres que no son ASCII dentro de TestString?


La codificación de "Test String" es la codificación del sistema definida por la implementación (la estrecha, posiblemente multibyte).

La codificación de u8"Test String" es siempre UTF-8.

Los ejemplos no son terriblemente reveladores. Si incluyó algunos literales de Unicode (como /U0010FFFF ) en la cadena, siempre los obtendría (codificados como UTF-8), pero si podrían expresarse en la cadena codificada por el sistema, y ​​de ser así, cuál sería su valor. be, está definido por la implementación.

Si ayuda, imagina que estás creando el código fuente en una máquina EBCDIC. Entonces, la literal "Cadena de prueba" siempre está codificada por EBCDIC en el propio archivo fuente, pero la matriz u8 contiene valores codificados en UTF-8, mientras que la primera matriz contiene valores codificados en EBCDIC.


Si el conjunto de caracteres de ejecución del compilador se establece en UTF-8, no hace ninguna diferencia si se usa u8 o no, ya que el compilador convierte los caracteres a UTF-8 en ambos casos.

Sin embargo, si el conjunto de caracteres de ejecución de los compiladores es la página de códigos no UTF8 del sistema (por defecto para, por ejemplo, Visual C ++), es posible que los caracteres no ASCII no se manejen correctamente cuando se omite u8 . Por ejemplo, la conversión a cadenas anchas se bloqueará, por ejemplo, en VS15:

std::string narrowJapanese("スタークラフト"); std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> convertWindows; std::wstring wide = convertWindows.from_bytes(narrowJapanese); // Unhandled C++ exception in xlocbuf.


Usted cita Wikipedia:

Con el fin de mejorar el soporte para Unicode en compiladores de C ++, la definición del tipo char se ha modificado para que tenga al menos el tamaño necesario para almacenar una codificación de ocho bits de UTF-8.

Bueno, el "Para el propósito de" no es cierto. Se ha garantizado que char siempre sea al menos de 8 bits, es decir, CHAR_BIT siempre debe ser ≥8, debido al rango requerido para char en el estándar C. Cuál es (citado C ++ 11 §17.5.1.5 / 1) "incorporado" en el estándar de C ++.

Si tuviera que adivinar sobre el propósito de ese cambio de redacción, sería simplemente aclarar las cosas para aquellos lectores que desconocen la dependencia del estándar C.

Respecto al efecto del prefijo literal u8 ,

  • afecta la codificación de la cadena en el ejecutable, pero

  • Lamentablemente no afecta al tipo.

Por lo tanto, en ambos casos, "tørrfisk" y u8"tørrfisk" se obtiene un char const[ n ] . Pero en el literal anterior, la codificación es lo que se selecciona para el compilador, por ejemplo, con Latin 1 (o Windows ANSI Western) que sería de 8 bytes para los caracteres más un nullbyte, para el tamaño de matriz 9. Mientras que en el último literal la codificación es Se garantiza que será UTF-8, donde el "ø" se codificará con 2 o 3 bytes (no recuerdo exactamente), para un tamaño de matriz un poco más grande.