c++ unicode utf-8 char c++11

Firma de char y Unicode en C++ 0x



utf-8 c++11 (3)

Del borrador de trabajo C ++ 0x, los nuevos tipos de caracteres ( char16_t y char32_t ) para manejar Unicode no estarán firmados ( uint_least16_t y uint_least32_t serán los tipos subyacentes).

Pero, por lo que puedo ver (no muy lejos tal vez), un tipo char8_t (basado en uint_least8_t ) no está definido. Por qué ?

Y es aún más confuso cuando ves que se introduce un nuevo prefijo de codificación u8 para el literal de cadena UTF-8 ... basado en el viejo amigo (signo / sin signo) char . Por qué ?

Actualización : hay una propuesta para agregar un nuevo tipo: char8_t

char8_t: un tipo para caracteres y cadenas UTF-8 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0482r0.html


char será el tipo utilizado para UTF-8 porque está redefinido para asegurarse de que se puede usar con él:

Con el fin de mejorar el soporte para Unicode en compiladores de C ++, la definición del tipo char se modificó para que sea al menos el tamaño necesario para almacenar una codificación de UTF-8 de ocho bits y lo suficientemente grande como para contener cualquier miembro del compilador conjunto de caracteres básicos de ejecución Anteriormente se definió como solo el último. Hay tres codificaciones Unicode compatibles con C ++ 0x: UTF-8, UTF-16 y UTF-32. Además de los cambios previamente notados a la definición de char, C ++ 0x agregará dos nuevos tipos de caracteres: char16_t y char32_t. Estos están diseñados para almacenar UTF-16 y UTF-32 respectivamente.

Fuente: http://en.wikipedia.org/wiki/C%2B%2B0x

La mayoría de las aplicaciones UTF-8 ya usan char en PC / mac.


char16_t y char32_t se supone que se pueden usar para representar puntos de código. Como no hay puntos de código negativos, es sensato que no estén firmados.

UTF-8 no representa puntos de código directamente, por lo que no importa si el tipo subyacente de u8 está firmado o no.


El borrador de C ++ 0x no parece indicar si los nuevos tipos de caracteres Unicode están firmados o no. Sin embargo, como otros ya han mencionado, dado que no hay puntos de código Unicode negativos, tendría más sentido que no se char16_t y char32_t . (Por otra parte, hubiera tenido sentido que char no estuviera firmado, pero hemos tratado con personajes "negativos" desde los años 70).

Además, dado que UTF-16 varía de 0x0 a 0xFFFF (ignorando los pares de sustitución), necesitaría todo el rango de un entero de 16 bits sin signo para representar correctamente todos los valores. Sería incómodo, por decir lo menos, si los puntos de código 0x8000 a 0xFFFF se representaran como números negativos con un char16_t .

De todos modos, hasta que el comité C ++ 0x diga algo definitivo al respecto, siempre puedes verificar tu implementación:

#include <type_traits> #include <iostream> int main() { std::cout << std::boolalpha << std::is_signed<char16_t>::value << std::endl; }

Esto imprime false usando GCC 4.45 en Linux. Entonces, en una plataforma, al menos, los nuevos tipos de Unicode definitivamente no tienen firma.