2013-01-08 23 views
0

我想检索字符的十六进制Unicode代表。例如,对于字符€,值应该是0x0080。我只需要为ISO 8859-1这个unicode编码的前256个字符做这个。所以我用C++中的无符号字符铸造,如下所示:C++检索十六进制的Unicode代码点

(unsigned char) normal_character 

这里,normal_character是char类型。 这个工作到目前为止,但是我有什么要注意的吗?

谢谢!

编辑:

我把人物€作为一个例子。它不在ISO 8859-1字符集中。

回答

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的范围完全一样)。

+0

+1进行解释和确认。 – Izza

1

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

+0

对不起,我以€为例。它不在ISO 8859-1中。但是,即使在您链接的维基百科文章中,也会在代码页面布局表中显示十六进制值。我检查过,值与我使用的十六进制值相同。不是这样吗? – Izza

相关问题