c++在十六进制中检索Unicode码点

C++ Retrieving the Unicode Code Point in Hex

本文关键字:Unicode 码点 检索 十六进制 c++      更新时间:2023-10-16

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

(unsigned char) normal_character

这里,normal_character是char类型。到目前为止,这是有效的,然而,有什么警告,我应该小心吗?

谢谢!

编辑:

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

根据定义,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文章中复制这些值(只需要从0x80到0xFF的值),因为0x00-0x7F的范围是完全相同的)。

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