在我的 Windows 机器上,locale
命令输出以下内容:
LANG=ru_RU
LC_CTYPE="ru_RU"
LC_NUMERIC="ru_RU"
LC_TIME="ru_RU"
LC_COLLATE="ru_RU"
LC_MONETARY="ru_RU"
LC_MESSAGES="ru_RU"
LC_ALL=
这完全没问题,只是语言环境输出中的“无字符集”意味着“ISO字符集”,这是ISO-8859-5
俄语/俄罗斯的,从未使用过(从历史上看,DOS使用CP866
,Windows使用ANSI codepade,并且在Unicode时代兴起之前CP1251
各种Unices都坚持使用)。KOI8-R
以上与locale charmap
输出一致,再次是ISO-8859-5
。
简短的 C 示例也证实了ISO-8859-5
这一点:
#include <stdio.h>
#include <locale.h>
#include <langinfo.h>
int main() {
const char *locale = setlocale(LC_ALL, "");
const char *codeset = nl_langinfo(CODESET);
printf("locale: %s\n", locale);
printf("codeset: %s\n", codeset);
return 0;
}
输出
locale: ru_RU/ru_RU/ru_RU/ru_RU/ru_RU/C
codeset: ISO-8859-5
Cygwin 文档状态那
从 Cygwin 1.7.2 开始,默认字符集由该语言和地区的默认 Windows ANSI 代码页决定。
这显然是错误的(Windows ANSI 代码页是CP1251
!)。令人惊讶的是,对于白俄罗斯语(东斯拉夫语,与俄语非常接近)be_BY
语言环境,默认字符集确实是CP1251
,这既符合文档,也符合常识。
这是 Cygwin 中的一个错误,还是我这里遗漏了什么?