俄语/俄罗斯的 Cygwin 语言环境

俄语/俄罗斯的 Cygwin 语言环境

在我的 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 中的一个错误,还是我这里遗漏了什么?

相关内容