考虑以下陈述 -
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?
答案 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)
这里有几个不同的问题/问题:
正如paxdiablo指出的那样,你看到的是“65”,因为你输出“a”(值'A'= ASCII 65)为“int”。
是的,gcc支持Unicode源文件:--finput-charset=OPTION
最后一个问题是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是从头开始设计的。
不幸的是,那时只意味着UTF-16。 Java 5支持nicode 6.0,Java 7 Unicode 6.0和当前的Java 8支持Unicode 6.2。
.Net更新。 C#,VB.Net和C ++ / CLI都完全支持Unicode 4.0。
较新版本的.Net支持较新版本的Unicode。例如,.Net 4.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还支持Unicode 4.0:http://www.diveintopython3.net/strings.html
答案 2 :(得分:0)
总之,如果有错误,请抱歉我的英语。
C ++字节是任何定义的位数,足以传输标准指定的集合中的每个字符。这个必需的字符集是ASCII的一个子集,之前定义的“位数”必须是char
的内存单元,这是C ++中最小的内存原子。每个其他类型必须是sizeof(char)
的倍数(任何C ++值都是连续存储在内存中的一堆字符)。
因此,sizeof(char)
的定义必须是1,因为它是C ++的内存测量单元。如果1表示1个物理字节是否是实现问题,但普遍接受为1个字节。
我不明白的是16位或32位字节是什么意思。
其他相关问题是关于编译的编码适用于源文本,包含的文字字符串。如果我没有错,编译器会将每个翻译单元(源代码文件)规范化为其选择的编码来处理文件。
我真的不知道引擎盖下发生了什么,但也许你已经读过一些关于源文件/内部编码的内容,以及16位/ 32位编码,所有的混乱都混合在你的头上。不过我还是很困惑。