g ++ 4.8.2编译器是否支持Unicode字符?

时间:2015-11-09 02:08:18

标签: c++ gcc g++ ascii

考虑以下陈述 -

cout<<"\U222B";

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

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

所以我想问两件事 -

1)如果我的编译器支持Unicode字符集,那么它为什么要实现ASCII字符集并显示字符的ascii值?

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

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

3 个答案:

答案 0 :(得分:0)

在回答第一个问题时,Unicode 的底部128个代码点是 ASCII。两者之间没有真正的区别。

您看到65的原因是因为您输出的内容(a)是int而不是char(它可能已启动作为char但是,通过将其放入a,您修改了将来如何处理它。

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

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

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

#include <iostream>
using namespace std;
int main() { cout << "\u222B\n"; }

上面运行该程序会显示正在输出的内容:

pax> g++ -o testprog testprog.cpp ; ./testprog
∫

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

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

pax> printf "\xe2\x88\xab\n"
∫

答案 1 :(得分:0)

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

  1. 正如paxdiablo指出的那样,你看到的是“65”,因为你输出“a”(值'A'= ASCII 65)为“int”。

  2. 是的,gcc支持Unicode源文件:--finput-charset=OPTION

  3. 最后一个问题是C ++编译器是否将“字符串”视为8位ASCII或n位Unicode。

    C ++ 11增加了对Unicode字符串和字符串文字的明确支持,编码为UTF-8,UTF-16大端,UTF-16小端,UTF-32大端和UTF-32小端:

  4. How well is Unicode supported in C++11?

    PS:

    对Unicode的语言支持:

答案 2 :(得分:0)

总之,如果有错误,请抱歉我的英语。

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

因此,sizeof(char)的定义必须是1,因为它是C ++的内存测量单元。如果1表示1个物理字节是否是实现问题,但普遍接受为1个字节。

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

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

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