alexey38Исходя из того, что сделано именно так, а не иначе можно сделать единственный вывод: разработчики fpc дословно копируют поведение компилятора Delphi, не больше и не меньше. Ньюанс лишь в том, что в дельфи все String=UnicodeString из-за чего в нем сей проблемы не заметно, а здесь - еще есть string в представлении turbo pascal и еще хрен знает каких реализаций паскаля. Поэтому компромисс и получается не очень. Плюс LCL, формально говоря, работающая "не по правилам".
Добавлено спустя 12 минут 41 секунду:alexey38 писал(а):В любом текстовом файле может быть BOM. Читаешь первые несколько байт, смотришь соответствуют они одному из вариантов значений BOM. Если нет, то выбираешь кодировку по умолчанию. Если это BOM, то читаешь в той кодировке, в которой задано BOM. Если не умеешь читать и конвертировать некую кодировку, то выдаешь сообщение об ошибке компиляции, с сообщением, что исходный файл в конкретной кодировке не поддерживается, с предложением его перекодировать внешним инструментом, например, в UTF-8. На мой взгляд все очень просто. И такой анализ займет всего несколько строк кода в компиляторе, и такой код разработчиком пишется минут за 15, и не нужно даже влазить в дебри самого компилятора. А более правильный вариант, взял FileStream, если файл в не той кодировке, то создал MemoryStream и в него переконвертировал, в одну из поддерживаемых компилятором, далее уже в сам парсер компилятора передается просто Stream. Это немного больше, но на мой взгляд это также можно сделать за 1 день и на всегда закрыть проблему.
А чем отличается поведение компилятора от того, что вы тут описываете?
Он берет файл, находит в нем маркер UTF-8, перекодирует строки в свой внутренний формат и применяет их куда нужно. Если вы определили
- Код: Выделить всё
Var s:UnicodeString;
s1:Utf8String;
s2:AnsiString(1251);
...
s:='строка';
s1:='строка';
s2:='строка';
- все присвоения будут правильными и в нужных кодировках.
Не находит маркера, - предполагает, что файл непонятно в какой кодировке и нужно во все переменные загрузить RawByte, то есть тот байтовый мусор, что есть в файле (если $codepage не определено) - вы же не сказали, к какой кодовой странице оно относится