Меня больше Linux волнует - в нем непредсказуемо происходит какая то ошибка с изменением файла извне. Я бы пока потестил Linux без потоков - может, там и не в потоках дело.
Не исправляйте как “пример исправлений” - мы либо принимаем всё, либо не принимаем. Разбираться в чужом коде, переключаться на него - так себе деятельность
Мда, это всё конечно грустно. @spectatorBH я так понимаю вам релевантно - можете тогда вы протестить?
Я скоро тоже тестить всё буду, для моих модулей понадобится. А пока я мелочи дочищал, чтобы в линуксе об них не вспотыкаться.
Та и не надо в том коде сильно копаться. Смысл был в том чтобы было видно в какой части проблема. Может лучше было сделать в виде драфта, чтобы его и нельзя было так просто принять?
Ну да ладно, пусть тогда пока живёт в виде issue. А я сам буду использовать свои же исправления.
P.S. А нет, одна всё же русская, и результаты на всех разные.
На второй англ. винде кодировка по умолчанию IBM437 и там русские символы превращаются в вопросы (символы #63).
Строчка Console.InputEncoding := Encoding.Unicode так же всё исправляет.
А русская винда имеет доисторическую версию (так что от win8 отличить сложно) и отказывается обновляться. Там по умолчанию на вводе cp866.
При установки UTF-16 на вывод консоль крашится (сообщение на экране тоже зажовывает между кодировками, поэтому ничего кроме чисел прочитать нельзя). Но у меня получилось выводить русские символы, после того как я установил cp866 и в Console.OutputEncoding (вместо UTF-8). Но тогда украинские символы становятся вопросами.
Тем не менее, опять же, после установки Console.InputEncoding := Encoding.Unicode - по крайней мере коды символов в string стали правильные, и для англ., и для русских, и для украинских символов. С выводом в cp866 тоже работает (но, опять же, не для укр. символов).
И до ещё 1 русской винды добрался. У неё тоже кодировки cp866 (ввод) и UTF-8 (вывод). На ней, по крайней мере, работают русские и англ. символы без доп. танцев с бубном.
Установка UTF-16 на ввод делает так что любые символы, хоть японские, правильно читаются в string (то есть коды символов правильные).
Но выводить всё кроме англ. и русских символов всё равно отказывается, даже при выводе UTF-16.
Честно говоря, я поражен. Потому что я считал, что Utf-8 выводит символы всех алфавитов мира. И Utf-16 здесь не имеет преимуществ.
У нас в PABCSystem прописано
if (System.Environment.OSVersion.Version.Major >= 6) and (System.Environment.OSVersion.Version.Minor >= 2) then
System.Console.OutputEncoding := Encoding.UTF8;
Ну так это кодировка вывода. Там уже дальше зависит от шрифта консоли - если в нём нет символа - его всё равно не выведет.
А я тут говорю про Console.InputEncoding - то есть кодировку ввода. И на большинстве компов в этом свойстве был вообще не юникод.
С UTF-8 на вводе (который на моём компе по-умолчанию) - тоже не понимаю почему не работает. Но предполагаю что дело в переводах между кодировками. Или может консоль считает её однобайтовой кодировкой? Ну, самое странное что у меня последняя версия win10. Я так понимаю у вас тоже. То есть дело должно быть в настройках?
Но, string всё же хранится именно в UTF-16. Поэтому перевод в/из UTF-8 для консоли, в любом случае не сдался. Экономия памяти там не на том маштабе, чтобы было заметно. А совместимость с 127 символами ASCII, на экране консоли, вообще ничего не делает.
Понятно, опять игнор… Тем временем я попробовал сделать #2726.
И простенькие программки прекрасно работают. Но проблема при интерапе с не_паскальными программами.
К примеру упаковщики POCGL запускают процессы гита с простыми командами, чтобы скачать XML данные об исходных .dll . Но если Console.InputEncoding переключён на UTF16 - вывод гита тоже пытается прочитать как UTF16, хотя он по умолчанию UTF8.
Это, конечно, не годится…
И в любом случае, стоит всё же разобраться почему у меня с UTF8 всё так криво. Но пока все зацепки что нагуглил - были бесполезны.
Должно ли быть так, и почему это происходит? При упоминании в коде программы символ * числоIsConsoleApplication переключается на true вне зависимости от того, запущена ли программа из-под оболочки или без связи с оболочкой. Примеры:
##
Write(IsConsoleApplication); //True
if false then
Write(' ' * 0);
##
Write(IsConsoleApplication); //True
if false then
begin
var str := '1' * 2;
end;
##
Write(IsConsoleApplication); //False
if false then
begin
var str := '12' * 2; //Теперь на число умножается не символ, а строка
end;