2016-11-23 127 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