【发布时间】:2017-03-22 20:59:47
【问题描述】:
我的设置:glibc 2.24、gcc 6.2.0、UTF-8 环境。
考虑以下示例:
#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 中的函数使用具有固定编码的宽字符。 (不用说,如果我们希望 ctype.h 中的函数能够正确处理非 ASCII 字符,并且如果我们使用 wchar.h 中的字符转换函数 - 设置外部编码,则需要 setlocale()。)
为什么没有setlocale(),这个例子就不能工作?
【问题讨论】:
-
它怎么知道使用哪个字母?
-
@IgnacioVazquez-Abrams ISO10646 - 对于宽字符是固定的。 gnu.org/software/libc/manual/html_node/Extended-Char-Intro.html
-
ISO 10646 没有命名字母表。
-
@IgnacioVazquez-Abrams 你有没有注意到我使用了
en_US.UTF-8,但是符号я不是来自en_US,它被正确分类了。所以,不,ISO10646 确实命名了字母表。 -
它不是 en_US 字母表的一部分,但它确实具有该语言的定义排序规则。
标签: c glibc wchar-t setlocale widechar