Я хотел бы получить представление Unicode в шестнадцатеричном формате для символов. Например, для символа € значение должно быть 0x0080. Мне нужно сделать это только для ISO 8859-1, первые 256 символов кодировки Unicode. Поэтому я использовал приведение к unsigned char в C ++, чтобы сделать это следующим образом:
(unsigned char) normal_character
Здесь normal_character имеет тип char.
Это сработало до сих пор, однако есть ли какие-то предостережения, о которых я должен быть осторожен?
Спасибо!
РЕДАКТИРОВАТЬ:
Я взял символ € в качестве примера. Его нет в кодировке ISO 8859-1.
Кодировка ISO-8859-1 по определению такая же, как и первые 256 кодовых точек таблицы Unicode. Так что достаточно простого числового приведения. Обратите внимание, однако, что кодовым точкам Unicode нужно как минимум 32 бита (на самом деле всего 21 бит, но … uint21_t
обычно не существует):
char ch_iso88591 = 'a';
uint32_t ch_unicode = (uint32_t)(unsigned char)ch_iso88591;
И, как вы правильно заметили в своем вопросе, вы должны unsigned char
из-за возможности char
быть подписанным.
Если исходная кодировка будет отличаться от ISO-8859-1 (или, конечно, ASCII), вам потребуется таблица. Например, Windows-1252 обычно путают с ISO-8859-1, но они несколько отличаются (см. Ваш пример €). Если у вас Windows-1252, то вы действительно нужно стол. Эта таблица на самом деле довольно проста для создания, вы можете скопировать значения самостоятельно из Статья в википедии (нужны только значения от 0x80 до 0xFF), потому что диапазон 0x00-0x7F точно такой же).
ISO 8859-1 не поддерживает €
символ (код Unicode U + 20AC) вообще. Там нет отображения, определенного в ISO 8859-1 для этого кода Unicode. ISO 8859-1 не определяет никакого значения для байтового октета 0x80
либо (большинство кодировок ISO 8859 этого не делают). Эта кодовая точка отображается в байтовый октет 0x80
в нескольких других кодировках, таких как Windows-1252, но не делает это во всех кодировках. Например, он отображается на 0xA4
вместо этого в ISO 8859-7: 2003 а также ISO 8859-15. Поэтому недостаточно просто обрезать это значение кодовой точки до 8-битного значения. Вы должны правильно отобразить это.