Nп/п : 55 из 100
От : Vitaliy Aksyonov 1:104/117 15 мар 24 19:23:06
К : Stas Mishchenkov 15 мар 24 04:38:02
Тема : Re: В консольном режиме Linux даже при выборе кодировки UTF-8 вместо ки
----------------------------------------------------------------------------------
@MSGID: 1:104/117 65f4f7c1
@REPLY: 2:460/5858 65f47128
@CHRS: CP866 2
@TZUTC: -0600
@TID: hpt/lnx 1.9 2022-07-03
Привет, Stas!
15 Mar 24 18:51, ты писал(а) мне:
SM>>> setlocale(LC_CTYPE, "");
SM>>> # LC_CTYPE now reset to the default defined by the
SM>>> # LC_ALL/LC_CTYPE/LANG environment variables, or to the system
SM>>> # default.
VA>> Это именно то, что надо. Когда вызываешь setlocale(LC_CTYPE,
VA>> NULL), то оно возвращает ранее выставленную локаль. А так, как ты
VA>> её явно не выставлял, то и возвращается "C".
SM> А GoldEd как-то иначе делает?
Они использует именно setlocale(LC_CTYPE, ""); И в некоторых местах
LC_ALL. Но это неважно.
VA>>>> Попробуй так: setlocale(LC_CTYPE, "");
SM>>> Та же фигня, только в левой руке.
Может это прикол перла? Попробуй накропать простенькую программу на
голом си и посмотри, что выдаст.
-------------
#include
#include
int main()
{
printf("%s", setlocale(LC_ALL, "");
return 0;
}
Что скажет? :)
VA>> Этот вариант как раз меняет локаль с "C" на то, что настроено в
VA>> системе. Почему оно у тебя возвращает "C", это вопрос.
SM> Пробовал заслать \0 - ваще тишину возвращает.
Венда, она вообще странная.
VA>> Я не перлом пробовал правда, но не думаю, что есть какая-то
VA>> разница, ведь перл тупо вызывает ту же системную функцию.
SM> Вот именно. Тот же POSIX locale_h. Запустил для чистоты эксперимента
SM> голый cmd.exe. Вот результат:
SM> Microsoft Windows [Version 10.0.19045.4170]
SM> (c) Корпорация Майкрософт (Microsoft Corporation). Все права защищены.
SM> D:\\Fido\\inbound>1_locale.pl
SM> C
SM> C
У меня программа на c выдаёт English_United States.1251
SM> D:\\Fido\\inbound>chcp
SM> Текущая кодовая страница: 866
Самое интересное, что даже после chcp 866 выдаёт ту же английскую локаль.
VA>>>> В твоём варианте оно возвращает текущую для процесса. А так,
VA>>>> как она ранее не была выставлена, то и возвращает C. Мой
VA>>>> вариант как раз выставляет локаль используя LANG и другие
VA>>>> переменные и возвращает тебе то, что наделал.
SM>>> Судя по доке, пустая строка должна вызвать ресет локали на
SM>>> дефаулт.
VA>> Именно. А он берется из тех же $LANG и так далее.
SM> Видимо, виндовс уже не такая уж и позикс совместимая.
Она никогда и не была POSIX совместимой.
SM>>> Да, это я проверял для
SM>>> D:\\Fido\\inbound>ver Microsoft Windows [Version 10.0.19045.4170]
SM>>> В семёрке оно, кажется, работало иначе.
VA>> Да одинаково оно работает. Просто в венде локаль странная.
SM> Я про то самое. Там так не получится.
VA>> Пробовал тот же скрипт ради интереса под линуксом запустить? Что
VA>> кажет?
SM> Да. Всё правильно кажет. Я уже здесь писал.
Ну хоть там по-человечески.
SM> [fido@brorabbit tests]$ ./1_locale.pl
SM> ru_RU.IBM866
SM> [ustasm@brorabbit ~]$ /home/fido/perl/tests/1_locale.pl
SM> ru_RU.UTF-8
Я тут накопал, почему когда локаль "неправильная" спеллчекер не
срабатывает. В смысле, пропускает русские слова. Из-за того, как там строка на
слова разбивается. Словом считается то, что состоит из букв, цифр и
символов "-`."
Причём определяется что символ - это буква вот таким мега алгоритмом:
====
int isxalnum(int c)
{
return isascii(c) ? isalnum(c) : (c != g_tolower(c)) || (c != g_toupper(c));
}
====
to_lower/to_upper не будут работать корректно для русских букв в "чужой" локали.
Вот и получается, что словарь загружен, но русские слова в него не
попадают. И дед просто их все считает правильнымию
В целом алгоритм имеет право на жизнь, но мне кажется, проще было
бы просто разрезать текст по пробелам/табам.
Best regards,
Vitaliy Aksyonov.
... Экипаж прощается с вами, желает вам счастливого полета.
--- GoldED+/LNX 1.1.5-b20240305-beta
* Origin: Aurora, Colorado (1:104/117)
SEEN-BY: 46/49 50/109 104/117 221/6 240/1120 250/25
301/1 341/66 451/31
SEEN-BY: 452/28 166 455/19 463/68 467/888 4500/1
5000/111 5001/100 5005/49
SEEN-BY: 5015/42 46 5019/40 400 5020/101 113 545
715 814 830 846 848 1042
SEEN-BY: 5020/2992 4441 5480 8086 12000 5022/128
5029/32 5030/49 115 1081
SEEN-BY: 5030/1474 5036/26 5049/1 3 5050/151
5053/51 58 5054/8 89 5058/104
SEEN-BY: 5060/900 5061/133 5068/45 5083/1 444
6090/1
@PATH: 104/117 5020/1042 4441