C ++以十六进制格式检索Unicode代码点

时间:2013-01-08 08:21:21

标签: c++ unicode iso-8859-1 unsigned-char

我想为十六进制字符检索unicode表示。例如,对于字符€,值应为0x0080。我只需要为ISO 8859-1(unicode编码的前256个字符)执行此操作。所以我在C ++中使用转换为unsigned char来执行以下操作:

(unsigned char) normal_character

这里,normal_character是char类型。 到目前为止这已经奏效了,但是我有什么需要注意的警告吗?

谢谢!

编辑:

我以角色€为例。它不在ISO 8859-1字符集中。

2 个答案:

答案 0 :(得分:2)

根据定义,ISO-8859-1编码与Unicode表的前256个代码点相同。所以简单的数字演员就足够了。请注意,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,那么确实需要一个表。这个表实际上很容易构建,你可以自己从Wikipedia article复制值(只需要从0x80到0xFF的值),因为0x00-0x7F范围是完全相同的。)

答案 1 :(得分:1)

ISO 8859-1根本不支持字符(Unicode代码点U + 20AC)。在ISO 8859-1中没有为该Unicode代码点定义映射。 ISO 8859-1也没有为字节八位字节0x80定义任何值(大多数ISO 8859字符集都没有)。该代码点确实映射到少数其他字符集中的字节八位字节0x80,例如Windows-1252,但在所有字符集中都不这样做。例如,它会映射到0xA4而不是ISO 8859-7:2003ISO 8859-15。因此仅将该代码点值截断为8位值是不够的。你必须正确地映射它。

相关问题