Aleksey Elin писал(а):Логично было бы ожидать что RawByteString строка без какой либо кодировки вообще (т.е. аналог "классической" AnisString).
Структурный тип, описывающий строку AnsiString, в уникодных версиях rtl всегда соедржит поле, описывающее кодировку. Если кодировки нет - это CP_NONE. Если установлена эта кодировка, символы не преобразуются при применении операторов read/write на консоль и в файл. Я имел в виду то, что я не исследовал поведения RawByteString в дельфи, т.е. в прототипе, поведение которого старательно копируется.
Aleksey Elin писал(а):Получается что:
- RowByteString - это единственная строка с "переменной" кодировкой.
- AnsiString - это строка с фиксированной кодировкой получаемой при присовении.
Нет. RawByteString = AnsiString(CP_NONE). Если в нее копируется строка с установленным флагом кодовой страницы, она в дальнейшем приобретает эту кодовую страницу и работает с ней, если флаг не сбросить через SetCodePage опять же в CP_NONE.
Aleksey Elin писал(а):Т.е. если использовать во всей программе единый пользовательский тип (лучший вариант по видимому UTF8String), то проблем со старым кодом быть не должно.
проблем со старым кодом и так в основном быть не должно, если не инициализировать "механизм уникодности" прямым указанием компилятору, с текстом в какой кодовой странице он работает. На чем и основано функционирование, например, лазаруса. Его библиотеки UnicodeStings и кодовые страницы AnsiStrings тихо игнорируют, и обычно это не отражается чем то необычным. Опять же, смотрим прототип. В Delphi XE2 String==UnicodeString. К вопросу о "лучшем варианте". UTF8String отнюдь не лучший выбор для будущего, ибо не позволяет индексирования лексических единиц в строке стандартными средствами. Нет, работать с символами UTF8 можно, но - это функционал библиотек LCL а не FPC, и сильно страдает читабельность кода.