2016-11-23 125 views
2

标准是否表示​​在以下两个程序中铸造到wint_twchar_t保证是正确的?如何转换为`wint_t`和`wchar_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 int,并且WEOF == ((wint_t)-1)。然后(wint_t)U+FFFF是 与WEOF没有区别。是的,U+FFFF是保留的编码点,但是 它碰撞仍然是错误的。

我不想发誓,如果没有 对现有实现进行详尽审计,这种情况在现实生活中不会发生。

May wchar_t be promoted to wint_t?

+0

没有提到wint_t的标准。 – gnasher729

回答

1

上看到你的描述,wchar_t不能准确地描述BMP环境:L'\uFEFF'超过wchar_t的范围内它的类型是无符号相当于wchar_t。 (C11 6.4.4.4字符常量p9)。将其存储到wchar_t(定义为signed short),假设16位短路,则更改其值。另一方面,如果用于源代码的字符集是Unicode并且编译器已正确配置为正确解析其编码,则L'ÿ'的值为255且为无符号类型,因此第二个示例中的代码是完美的明确的和明确的。

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

+0

但是将'(-1)'返回到'unsigned short'相当于0xFFFF,这将是unicode中的一个有效字符,或者我忘记了什么? –

+0

您似乎在UTF-8中间段落中使用了UTf-8和codepoint,UTF-8中的octet 255无效,UTF-8中的L'ÿ'c编码为两个八位字节,即BF BF。 –

+0

@PeteKirkham:为了清晰起见,我重新解释了答案,charset和文件编码是两个不同的问题,只要它是正确和正确配置的,我们并不关心编码。 – chqrlie