2011-12-20 19 views
5

Estoy trabajando con una biblioteca de C++ y necesito crear una char sin firmar desde un punto de código UTF-8. Por ejemplo, si el punto de código es decimal 610 (una 'letra latina pequeña capital G'), ¿cómo crearía esto en C++?C++: cómo crear char sin signo desde el punto de código UTF-8

I Javascript, que puede hacer lo siguiente:

var temp = String.fromCharCode(610); 
console.log(temp); // Outputs a small 'G' (correct) 
var codePoint = temp.charCodeAt(0); 
console.log(codePoint); // Outputs 610 (correct) 

En C++ han intentado:

unsigned char temp = (unsigned char)610; 
// compiles, but 
Debug::WriteLine((int)temp); // outputs 98 (??) 

Sírvanse proporcionar un ejemplo de código en C++ que realiza el mismo que el ejemplo de JavaScript anteriormente.

El entorno está en C++ administrado, pero quiero evitar el uso de tipos CLR ya que estoy interactuando con una biblioteca de terceros.

+0

¿Cuál es el tipo de 'Debug'? ¿'Debug' reconoce UTF? Porque C++ ostreams no. Necesita una biblioteca para hacer mucho con UTF, especialmente UTF8. –

+0

'unsigned char' solo garantiza valores de hasta 255; un punto de código Unicode puede ser mucho más grande. Tu problema no está bien indicado. –

+0

Ah, la vida sería mucho más fácil si fuera posible ... –

Respuesta

5

Un unsigned char es pequeño para contener un valor de 610 (suponiendo un char es de 8 bits de ancho, sólo puede contener valores de 0 a 255), por lo que será wrap around *

Uso char16_t para almacenar un 16 -bit char (o char32_t para un carácter de 32 bits, que UTF-8 requiere).

char32_t temp = (char32_t)610; 
Debug::WriteLine(temp); // outputs 610 (!!) 

Si desea manejar UTF-8 cadenas, el uso de UTF-8 literales de cadena:

u8"I'm a UTF-8 string." 

* Se envolver alrededor de incluso dos veces en su ejemplo:

610 - 256 - 256 = 98

+0

Tenga en cuenta que 'char16_t' y' char32_t' se utilizan aquí como _codepoints_. –

+0

@MooingDuck, olvidó mencionar que 'char16_t' no es lo suficientemente grande como para contener todos los puntos de código y debe evitarse con ese fin. Se puede usar una cadena de 'char16_t' para contener UTF-16 según lo requiera Windows. –

3

Los puntos de código Unicode pueden necesitar representaciones de 32 bits. En la mayoría de los idiomas occidentales, 16 bits son suficientes, pero para manejar todos los posibles puntos de código Unicode, realmente necesita 32 bits.

uint32_t codePoint = someString.CodePointAt(x); 

Puede leer más sobre esto aquí: http://en.wikipedia.org/wiki/Code_point.

+0

Unicode usa hasta 21 bits.No hay tipos de datos numéricos que puedan representar de 17 a 31 bits de datos, por lo que necesita un tipo numérico de 32 bits para representar 21 bits de datos. –

0

Si quiere decir que desea crear un señalador unsigned char a la representación UTF-8 del punto de código Unicode 610 que podría hacer:

char unsigned temp[] = { 0xc9, 0xa2 }; 
Cuestiones relacionadas