c++在十六进制中检索Unicode码点
C++ Retrieving the Unicode Code Point in Hex
我想检索十六进制字符的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位值是不够的。你需要正确地映射它
- Unicode - ICU 库 - 获取 UnicodeString 中的代码点计数
- 字符串到 Unicode,Unicode 到十进制码位 (C++)
- C++Unicode:字节、代码点和图形
- 如何打印 unicode 代码点
- C++函数,用于判断 unicode 点是否为'letter'而不是标点符号数
- 使用 C++ 测试 Unicode 代码点是否在 ISO-8859-5 集中
- 如何在c++中将unicode代码点转换为utf-8
- 如何使用特定的 Unicode 代码点 RTRIM wchar_t
- ASCII 码等同于 Java 中的 unicode 字符
- 匹配 Unicode 代码点的约定,同时遵守 BOM
- 使用json_write()时有两个unicode代码点
- 如何在char16_t字符串文本中编码 Unicode 点 U+10000
- 来自Unicode字符的码点
- 逐个字符迭代Unicode码点
- 虚拟键码到unicode的映射受写入std::cout的影响
- 如何从一个特定的点(时间码)使用Qt播放声音
- 在Mac OS X下,vswprintf在某些unicode码点上失败
- 如何使用ICU将Unicode代码点转换为C++中的字符
- c++在十六进制中检索Unicode码点
- 获取unicode代码点的大写或小写(如uint32_t)