我的設置:glibc 2.24,gcc 6.2.0,UTF-8環境。爲什麼wctype.h中的函數不能在沒有setlocale()的情況下工作?
請看下面的例子:
#include <wchar.h>
#include <wctype.h>
#include <locale.h>
int main(void)
{
setlocale(LC_CTYPE, "en_US.UTF-8");
wchar_t wc = L'я'; /* 00000100 01001111 */
if (iswlower(wc)) return 0;
return 1;
}
編譯並運行它:
$ gcc test.c
$ ./a.out; echo $?
0
現在除去setlocale()
並再次運行。其結果是不同的:從技術上講,在這裏不需要
$ gcc test.c
$ ./a.out; echo $?
1
setlocale()
,因爲從與寬字符,其具有固定的編碼wctype.h
功函數。 (不用說,setlocale()
是必需的,如果我們想從ctype.h
功能與非ASCII字符正常工作,如果我們用字符轉換函數從wchar.h - 設置外部編碼)
爲什麼沒有按範例沒有setlocale()
?
如何知道要使用哪個字母? –
@ IgnacioVazquez-Abrams ISO10646 - 它適用於寬字符。 https://www.gnu.org/software/libc/manual/html_node/Extended-Char-Intro.html –
ISO 10646沒有命名字母表。 –