首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >g++ 4.8.2编译器支持Unicode字符吗?

g++ 4.8.2编译器支持Unicode字符吗?
EN

Stack Overflow用户
提问于 2015-11-09 10:08:18
回答 3查看 1.4K关注 0票数 0

请考虑以下语句:

代码语言:javascript
复制
cout<<"\U222B";

int a='A';
cout<<a;

第一条语句打印一个积分符号(相当于Unicode代码点的字符),而第二条cout语句打印ASCII值65。

所以我想问两件事-

2)关于这个问题-- what is the difference in defining the 'byte' in terms of computer memory and in terms of C++?

我的编译器实现的是16位还是32位字节?如果是,为什么CHAR_BIT的值设置为8?

EN

回答 3

Stack Overflow用户

发布于 2015-11-09 10:19:08

关于您的第一个问题,Unicode的底部128个代码点是ASCII。这两者之间没有真正的区别。

您看到65的原因是因为您要输出的东西(a)是一个int而不是char (它最初可能是一个char,但是通过将它放入a中,您修改了它在未来的处理方式)。

对于您的第二个问题,字节是一个char,至少就ISO和C++标准而言是这样。如果CHAR_BIT被定义为8,那么这就是您的char类型的宽度。

但是,您应该记住Unicode代码点和Unicode表示形式(如UTF-8)之间的区别。如果使用UTF8表示,拥有CHAR_BIT == 8仍然允许Unicode工作。

我的建议是使用十六进制转储实用程序捕获程序的输出,您可能会发现Unicode字符输出为e2 88 ab,这是U+222B的UTF8表示。然后,它将由程序外部的某些东西(例如,终端程序)解释,以呈现正确的字形:

代码语言:javascript
复制
#include <iostream>
using namespace std;
int main() { cout << "\u222B\n"; }

运行上面的程序可以看到输出的内容:

代码语言:javascript
复制
pax> g++ -o testprog testprog.cpp ; ./testprog
∫

pax> ./testprog | hexdump
0000000 e2 88 ab 0a

您可以通过以不同方式生成相同的UTF-8字节序列来确认这一点:

代码语言:javascript
复制
pax> printf "\xe2\x88\xab\n"
∫
票数 0
EN

Stack Overflow用户

发布于 2015-11-09 10:31:13

这里有几个不同的问题/问题:

  1. 正如paxdiablo指出的那样,你看到的是"65“,因为你输出的是"a”(值'A‘=ASCII65)作为一个“整数”。
  2. 是的,gcc支持Unicode源文件:最后一个问题是C++编译器是把你的“字符串”当作8位ASCII码还是n位Unicode。

C++11添加了对Unicode字符串和字符串文字的显式支持,编码为UTF-8、UTF-16高字节顺序、UTF-16低字节顺序、UTF-32高字节顺序和UTF-32低字节顺序:

How well is Unicode supported in C++11?

PS:

至于Unicode的语言支持:

  • Java从头开始就是为Unicode设计的。

不幸的是,当时这意味着只有UTF-16。Java5支持Nicode6.0,Java7Unicode6.0,当前的Java8支持Unicode6.2。

  • .Net较新。C#、VB.Net和C++/CLI都完全支持Unicode4.0。

较新版本的.Net支持较新版本的Unicode。例如,UNICODE4.0支持Unicode 5.1](What version of Unicode is supported by which .NET platform and on which version of Windows in regards to character classes?).

  • Python3也支持UNICODE4.0:http://www.diveintopython3.net/strings.html
票数 0
EN

Stack Overflow用户

发布于 2015-11-09 10:40:56

最重要的是,如果我的英语有错误,我很抱歉。

C++字节是任何定义的比特量,其大小足以传输标准指定的集合中的每个字符。这组必需的字符是ASCII码的子集,先前定义的“位数”必须是char的存储单元,它是C++中最小的内存原子。其他类型必须是sizeof(char)的倍数(任何C++值都是一堆连续存储在内存中的字符)。

因此,根据定义,sizeof(char)必须是1,因为它是C++的内存度量单位。如果1是否意味着1个物理字节是一个实现问题,但被普遍接受为1个字节。

我不明白的是,16位或32位字节是什么意思。

其他相关问题是关于编译后应用于源文本的编码,包括文字字符串。如果我没记错的话,编译器会将每个翻译单元(源代码文件)规范化为其选择的编码来处理该文件。

我真的不知道幕后发生了什么,但也许你已经读过一些关于源文件/内部编码的东西,以及16位/32位编码和所有的混乱混合在你的头上。不过,我还是很困惑。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33601439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档