2010-03-06 17 views
10

Desde el borrador de trabajo C++ 0x, los nuevos tipos char (char16_t y char32_t) para el manejo de Unicode será sin signo (uint_least16_t y uint_least32_t se ser los tipos subyacentes).de signo de carbón y Unicode en C++ 0x

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 un nuevo U8 codificación de prefijo se introdujo para UTF-8 cadena literal ... basado en viejo amigo (signo/sin signo) carbón. Por qué ?

actualización: Hay una propuesta de añadir un nuevo tipo: char8_t

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

Respuesta

3

char16_t y char32_t se supone que son utilizables para la representación puntos de código Como no hay puntos de código negativos, es sensato que no estén firmados.

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

+2

Si quiero almacenar el carácter é (U + 00E9), esa es la secuencia de dos bytes 0xC3 0xA9, con una matriz de caracteres firmados fallará: signed char e_acute = {0xC3,0xA9} => esto truncará el valor. Entonces, si su sistema define char como char firmado, sigue siendo un problema. Me equivoco ? – anno

+0

Muy raramente necesita ingresar los bytes manualmente: a menudo, como usted dice, se usa el 'u8'. Entonces, los bytes altos solo se tratan como números negativos en ese caso. –

+1

Chris, ¿hay alguna garantía de que el par de conversiones 'unsigned char-> signed char-> unsigned char' arrojará el valor original? La primera conversión está definida por la implementación y no pude encontrar ninguna cláusula que garantizara el viaje de ida y vuelta. – avakar

3

carbón será del tipo utilizado para UTF-8 porque se redefinió para asegurarse de que se puede utilizar con él:

Con el fin de mejorar el apoyo para Unicode en los compiladores de C++, la definición del tipo char se ha modificado para ser a la vez al menos el tamaño necesaria para almacenar un ocho bits de codificación de UTF-8 y lo suficientemente grande como para contener cualquier miembro de carácter básico ejecución del compilador establece. Era previamente definido como solo el último. Hay tres codificaciones Unicode que C++ 0x admitirán: UTF-8, UTF-16 y UTF-32. Además de los cambios anotados anteriormente en en la definición de char, C++ 0x agregará dos nuevos caracteres tipos: 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 UTF-8 aplicación utiliza carbón ya de todos modos en PC/Mac.

+0

No dice una palabra de firmado. – anno

+0

Ah tienes razón. :/ – Klaim

+0

¿Por qué el fraseo incómodo de la parte en negrita? ¿No es redundante la "codificación de ocho bits de UTF-8"? – dan04

1

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 char16_t y char32_t no estén firmados. (Por otra parte, hubiera tenido sentido que char no se firmara, pero hemos estado lidiando con caracteres "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é de C++ 0x dice algo definitivo sobre el asunto, siempre puede comprobar su aplicación:

#include <type_traits> 
#include <iostream> 

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

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