如何转换为`wint_t`和`wchar_t`?

时间:2016-11-23 08:24:47

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

标准是否保证在以下两个程序中投射到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?

1 个答案:

答案 0 :(得分:1)

在您描述的环境中,wchar_t无法准确描述BMP:L'\uFEFF'超出wchar_t的范围,因为其类型是无符号,等同于{ {1}}。 (C11 6.4.4.4字符常数p9 )。将其存储到定义为wchar_t的{​​{1}},假定为16位短路,则会更改其值。

另一方面,如果用于源代码的字符集是Unicode并且编译器已正确配置为正确解析其编码,则wchar_t具有带有无符号类型的值signed short,因此第二个例子中的代码是完美定义和明确的。

如果L'ÿ'为32位宽且255为16位宽,则将int定义为shortwchar_t似乎更加一致。然后可以将int定义为unsigned short,该值不同于WEOF的所有值或至少代表Unicode代码点的所有值。