C ++: как создать беззнаковый символ из кодовой точки UTF-8 - PullRequest
5 голосов
/ 20 декабря 2011

Я работаю с библиотекой C ++, и мне нужно создать беззнаковый символ из кодовой точки UTF-8.Например, если кодовая точка равна десятичное 610 («латинская буква с маленькой буквы G»), как бы я создал это в C ++?

Я javascript, я могу сделать следующее:

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

В C ++ пытались:

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

Пожалуйста, предоставьте пример кода на C ++, который выполняет то же самое, что ипример javascript выше.

Среда находится в управляемом C ++, но я хочу избегать использования типов CLR, поскольку я взаимодействую со сторонней библиотекой.

Ответы [ 3 ]

5 голосов
/ 20 декабря 2011

Значение unsigned char слишком мало, чтобы содержать значение 610 (при условии, что символ имеет ширину 8 битов, он может содержать значения только от 0 до 255), поэтому он будет обтекать *

Используйте char16_t для хранения 16-битного символа (или char32_t для 32-битного символа, который требуется UTF-8).

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

Если вы хотите обрабатывать строки UTF-8 , используйте строковые литералы UTF-8:

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

* В вашем примере это обернется еще дважды:

610 - 256 - 256 = 98

3 голосов
/ 20 декабря 2011

Для кодовых точек Unicode могут потребоваться 32-битные представления.В большинстве западных языков достаточно 16 бит, но для обработки всех возможных кодовых точек Unicode вам действительно нужно 32 бита.

uint32_t codePoint = someString.CodePointAt(x);

Подробнее об этом можно прочитать здесь: http://en.wikipedia.org/wiki/Code_point.

0 голосов
/ 21 декабря 2011

Если вы хотите создать беззнаковый символ, указывающий на представление UTF-8 кодовой точки Unicode 610, вы можете сделать:

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