获取Unicode字符C++的十进制值



如何获取Unicode字符的十进制值,如"Ồ">

std::string a = "Ồ";
unsigned char c = a[0];
long val = long(c);
cout << val << endl;

输出

7,891;

您的问题看起来可能很直接,但当我们深入研究时,我们会发现它并不像最初看起来那么简单。

第一个问题是CCD_ 1被定义为CCD_;Ồ&";。因此,你从代码中得到的结果可能取决于你使用的编译器和/或你运行的环境和操作系统;Ồ"作为无效的ASCII字符,并将"(或0x3F(。

第二个问题是;Ồ"大于8位宽,因此它可能不适合变量c。无论编译器在a[0]中放入什么,变量c都将只保存该值的char位。同样,你得到的结果可能会根据你使用的编译器和/或你运行的环境而改变

抛开这一点不谈,让我们从假设字符";Ồ"为拉丁文大写字母O,带圆形和砾石(0x1ED2(。有了这个假设,人们可能会想象我们想要得到的答案是0x1ED2,对吧?但不一定。

有几种方法可以对Unicode字符进行编码。UTF-32编码是0x1ED2(或者0x00001ED2,如果我们包括所有前导零以获得32位(。UTF-8编码为0xE1BB92。

因此,";Ồ"如果是用UTF-32编码的,则为7890;如果是用UTF-8编码的,为14793618(为了简化起见,我忽略了字节序的影响(

Unicode网站有一个关于编码的常见问题解答,维基百科也有一个页面。

正如您所看到的,问题的答案(在某种程度上(取决于您想要使用的编码。处理编码的一种C++方法是std::codecvt。另一种解决方案是将字符串视为一个字节序列(您的代码试图这样做(,但这取决于您知道系统如何对字符串进行编码,处理的字节序是什么等等。而且代码不一定是可移植的。

另一个需要考虑的问题是,在一般情况下;Ồ"可能不是一个字符。很明显,它是代码中的一个字符。但如果你从磁盘文件中读取一个字符串,比如说,当打印或显示该文件时;Ồ"我们不能假设该文件包含单个";Ồ"性格

Unicode将组合CIRCUMFLEX ACCENT(0x0302(和组合GRAVE ACCENT(0x00300(定义为可以与其他字符组合的单独字符。它定义了中间字符,如拉丁大写字母O WITH GRAVE和拉丁大写字母奥WITH ACUTE,所以实际上有几种方法可以在内存(或磁盘文件(中创建字符串,这将给你带来与字符"相同的效果;Ồ&";。

最新更新