【问题标题】:difference between integral value of wchar_t character in two situation两种情况下 wchar_t 字符的整数值之间的差异
【发布时间】:2013-07-05 19:15:15
【问题描述】:

当我使用此代码在 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);

【问题讨论】:

  • wchar_t wc = L"س"; 甚至不会编译(带双引号)。你能展示你使用的真实代码吗(包括你如何写入文件)?
  • 哦,对不起,你是对的。谢谢你。在我的代码中是L'س'
  • @JesseGood 我添加了真实代码
  • cout &lt;&lt; wc 不会给您期望的结果。它会将输入拆分为 8 位字符,然后打印。您需要使用 wcout。 wcout &lt;&lt; int(wc) 有什么价值?
  • @Zaphod:这是不正确的。当您将 wchar_t 类型传递给 std::cout 时,它会打印十进制值(作为整数)。

标签: c++ unicode wchar-t


【解决方案1】:

d8 b3 表示十进制的 55475。

这是 UTF-8 中 Unicode Character 'ARABIC LETTER SEEN' 的正确编码。见here for a reference0xD8 0xB3 (d8b3)。当我使用您的代码并使用可以理解 UTF-8 而没有 BOM 的文本编辑器打开它时,我可以看到该字符。十进制的1587,是字符以UTF-16或UTF-32编码时的值。

【讨论】:

  • 我得到 1587 标准输出。 cout 使用 UTF-16 还是 UTF-32?
  • @JalalJaberi: std::cout 只打印存储在wc 中的值,因为它不知道wchar_t,它只显示char 类型的字符。在 Windows 上,wchar_t 是 16 位类型并存储编码为 UTF-16 的字符,当您将其写入文件时,您指定将字符转换为 UTF-8
【解决方案2】:

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 十六进制表示。

【讨论】:

  • 好的,我的问题和你的回答有什么关系我的朋友? :-?
  • 十进制 1587,十六进制 633 在第二个范围内。十六进制的 633 二进制是 11000110011,但它会表示为 110 11000 10 110011。即十六进制的 D8B3。
猜你喜欢
  • 2023-01-25
  • 2014-09-09
  • 2011-09-25
  • 1970-01-01
  • 1970-01-01
  • 2020-04-11
  • 2012-03-10
  • 2018-01-07
  • 2021-08-28
相关资源
最近更新 更多