1

В моем окне 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=

Это прекрасно, за исключением того, что "no charset" в выводе локали означает "ISO charset", то есть ISO-8859-5 для России и России и никогда не использовался (исторически DOS использовал CP866 , Windows использовал CP1251 кодовый код ANSI, и различные Unices придерживались KOI8-R до появления эры Unicode).

Вышеуказанное согласуется с выводом 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, или я что-то здесь упускаю?

0