C++ 两种情况下wchar__t字符积分值之差

C++ 两种情况下wchar__t字符积分值之差,c++,unicode,wchar-t,C++,Unicode,Wchar T,当我使用这段代码获得unicode格式的整型值“س”时,我得到了1587(即十六进制格式的633)。这是unicode标准中“س”的正确值 wchar_t wc = L'س'; cout<<wc; // or wcout<<int(wc); UTF-8不使用所有位来表示字符,因为它至少需要一位来表示字符点跨越更多字节。 你可以在这里看到: 从中,有代码点范围及其二进制表示形式: U-00000000 – U-0000007F: 0xxxxxxx U-0000008

当我使用这段代码获得unicode格式的整型值“س”时,我得到了1587(即十六进制格式的633)。这是unicode标准中“س”的正确值

wchar_t wc = L'س';
cout<<wc; // or wcout<<int(wc);

UTF-8不使用所有位来表示字符,因为它至少需要一位来表示字符点跨越更多字节。 你可以在这里看到:

从中,有代码点范围及其二进制表示形式:

U-00000000 – U-0000007F:    0xxxxxxx
U-00000080 – U-000007FF:    110xxxxx 10xxxxxx
U-00000800 – U-0000FFFF:    1110xxxx 10xxxxxx 10xxxxxx
U-00010000 – U-001FFFFF:    11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 – U-03FFFFFF:    111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 – U-7FFFFFFF:    1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
编辑:更清楚地说,D8B3是代码点1587的unicode十六进制表示形式

d8 b3表示十进制55475


这是UTF-8中Unicode字符“阿拉伯字母SEEN”的正确编码。看<代码>0xD8 0xB3(d8b3)。当我使用你的代码,并用一个理解UTF-8而没有BOM的文本编辑器打开它时,我可以看到这个字符<十进制的code>1587,是字符以UTF-16或UTF-32编码时的值。

wchar_t wc=L“س”甚至不会编译(使用双引号)。你能展示你使用的真实代码吗(包括你如何写入文件)?哦,对不起,你是对的。非常感谢。在我的代码中是
L'س'
。@JesseGood我添加了真实的代码
cout@Zaphod:这是不正确的。当您将
wchar\u t
type传递到
std::cout
时,它会打印十进制值(作为一个整数)。我得到1587个标准输出
cout
使用UTF-16或UTF-32?@JalalJaberi:
std::cout
只打印存储在
wc
中的值,因为它不知道
wchar\u t
,它只显示
char
类型的字符。在windows上,
wchar\u t
是一种16位类型,存储编码为UTF-16的字符,当您将其写入文件时,您指定将字符转换为UTF-8确定,我的问题和您的答案之间的关系是什么我的朋友?:-?1587十进制,633十六进制在第二个范围内。633十六进制在二进制中是1100011011,但它将表示为110 11000 10 110011。这是十六进制的D8B3。
U-00000000 – U-0000007F:    0xxxxxxx
U-00000080 – U-000007FF:    110xxxxx 10xxxxxx
U-00000800 – U-0000FFFF:    1110xxxx 10xxxxxx 10xxxxxx
U-00010000 – U-001FFFFF:    11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 – U-03FFFFFF:    111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 – U-7FFFFFFF:    1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx