当我使用此代码在unicode中获取'س'的整数值时,我得到1587(十六进制为633)。这是unicode标准中'س'的正确值。
wchar_t wc = L'س';
cout<<wc; // or wcout<<int(wc);
现在,我将此字符放入带有UTF-8字符编码的txt文件中,然后以十六进制模式检查其值。我获得了d8 b3
,意思是十进制的55475。
为什么这些值不是马赫?
已添加:这是我的代码:
wchar_t wc = L'س';
FILE *f;
f = fopen("input1.txt", "w");
_setmode(_fileno(f), _O_U8TEXT);
fwprintf(f, L"%c", wc);
fclose(f);
答案 0 :(得分:1)
UTF-8不使用所有位来表示字符,因为它需要至少一位来表示字符点跨越更多字节。 你可以在这里看到它:https://en.wikipedia.org/wiki/UTF-8
从http://www.cl.cam.ac.uk/~mgk25/unicode.html开始,有代码点范围及其二进制表示:
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十六进制表示。
答案 1 :(得分:1)
d8 b3表示55475十进制。
这是UTF-8中Unicode Character 'ARABIC LETTER SEEN'
的正确编码。见here for a reference。 0xD8 0xB3 (d8b3)
。当我使用你的代码并使用一个理解UTF-8而没有BOM的文本编辑器打开它时,我可以看到这个角色。十进制1587
是字符以UTF-16或UTF-32编码时的值。