【问题标题】:How to cast to `wint_t` and to `wchar_t`?如何转换为`wint_t`和`wchar_t`?
【发布时间】:2017-04-07 03:44:24
【问题描述】:

标准是否表明在以下两个程序中转换为wint_twchar_t 可以保证正确?

#include <locale.h>
#include <wchar.h>
int main(void)
{
  setlocale(LC_CTYPE, "");
  wint_t wc;
  wc = getwchar();
  putwchar((wchar_t) wc);
}

--

#include <locale.h>
#include <wchar.h>
#include <wctype.h>
int main(void)
{
  setlocale(LC_CTYPE, "");
  wchar_t wc;
  wc = L'ÿ';
  if (iswlower((wint_t) wc)) return 0;
  return 1;
}

考虑wchar_tsigned short 的情况(这个 假设的实现仅限于 BMP),wint_tsigned intWEOF == ((wint_t)-1)。然后(wint_t)U+FFFF 是 与WEOF 无法区分。是的,U+FFFF 是保留的代码点,但是 碰撞还是不对的。

我不想发誓这在现实生活中永远不会发生 对现有实施的详尽审计。

另见May wchar_t be promoted to wint_t?

【问题讨论】:

  • 没有提到wint_t的标准。

标签: c standards wchar-t widechar c-standard-library


【解决方案1】:

在您描述的环境中,wchar_t 无法准确描述 BMP:L'\uFEFF' 超出了wchar_t 的范围,因为它的类型是与wchar_t 等效的无符号。 (C11 6.4.4.4 字符常量 p9)。将其存储到定义为 signed shortwchar_t 中,假设 16 位短路,会更改其值。

另一方面,如果用于源代码的字符集是 Unicode 并且编译器被正确配置为正确解析其编码,L'ÿ' 的值 255 具有无符号类型,所以第二个中的代码示例是完美定义且明确的。

如果 int 是 32 位宽而 short 是 16 位宽,则将 wchar_t 定义为 intunsigned short 似乎更加一致。然后WEOF 可以定义为(-1),一个不同于wchar_t 的所有值或至少所有代表Unicode 代码点的值的值。

【讨论】:

  • 但是将 (-1) 返回到 unsigned short 相当于 0xFFFF 这将是 unicode 中的有效字符,还是我忘记了什么?
  • 您似乎在中间段落中混淆了 UTf-8 和代码点,在 UTF-8 中,八位字节 255 无效,而 UTF-8 中的 L'ÿ' 被编码为两个八位字节,C3 BF .
  • @PeteKirkham:为了清楚起见,我重新表述了答案,字符集和文件编码是两个不同的问题,只要编码正确且配置正确,我们不关心编码。
  • @KamiKaze: 0xFFFF 实际上是一个无效的 Unicode 代码点,但如果 wchar_t 是无符号的,它将是一个有效的 wchar_t 值,并且它会有所不同是有道理的来自WEOF,这可以通过将WEOF定义为(-1)wint_t定义为int来实现。
猜你喜欢
  • 2010-11-08
  • 2020-07-11
  • 2018-01-07
  • 2012-02-13
  • 2011-03-14
  • 2021-01-29
  • 2010-09-09
  • 1970-01-01
相关资源
最近更新 更多