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

标签 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 字符集中。

最佳答案

根据定义,ISO-8859-1 编码与 Unicode 表的前 256 个代码点相同。所以一个简单的数字转换就足够了。但是请注意,Unicode 代码点至少需要 32 位(实际上只有 21 位,但是...... uint21_t 通常不存在):

char ch_iso88591 = 'a';
uint32_t ch_unicode = (uint32_t)(unsigned char)ch_iso88591;

正如您在问题中正确指出的那样,由于 char 被签名的可能性,您必须将其转换为 unsigned char

如果原始字符集不是 ISO-8859-1(当然是 ASCII),则需要使用表格。例如,Windows-1252 通常与 ISO-8859-1 混淆,但它们有些不同(请参阅您的 € 示例)。如果您有 Windows-1252,那么您确实需要一张表。这个表其实很简单,你可以自己从Wikipedia article中复制值。 (只需要从 0x80 到 0xFF 的值),因为 0x00-0x7F 范围完全相同。

关于C++ 以十六进制检索 Unicode 代码点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14210870/

相关文章:

c++ - std::u8string与std::string有何不同?

java - 给定 Unicode 代码点的编号,如何获取该字符的 String 或 CharSequence 对象

node.js - 使用 NodeJS/Express 返回 ISO-8859-1 中的 JSON 响应

c++ - 在 Code::Blocks 中出现范围错误

Qt 的 QDir : File Names Dropping Non-Ascii Characters

c++ - 简化三次贝塞尔路径?

mysql - 表和列的 mysql 字符集可以不同吗?

debugging - 如何评估QR码的质量/正确性? (如何获得定量和定性的QR码特征)

c++ - vs2010中的变量排列

c++ - 为什么我的部分代码被跳过而不让我输入?