sign писал(а):Aleksey Elin писал(а):Подозреваю что в константе cc неверно задана кодировка
Кодировка константы = кодировке страницы.
Кодировка страницы - см.
1.jpg
У меня именно так и есть - кодировка страницы utf8.
Собственно я об этом и писал - видно что в константе хранятся именно utf8 символы, но при присваивании переменной UnicodeString происходит неверное преобразование неизвестно во что.
- Код: Выделить всё
const
cc = 'Привет мир';
----------------------------
var
t : string;
s : UncodeString;
----------------------------
s:=cc;
s:='Привет мир';
s:=string('Привет мир');
s:=string(cc);
t:=cc; s:=t;
Добавлено спустя 2 часа 32 минуты 38 секунд:Немного разобрался что происходит с константами.
Компилятор FPC для каждой строковой константы создает два представления в области констант: в однобайтовой кодировке (CP_ACP=0 или CP_UTF8 в зависимости от BOM см.ниже) и в двухбайтовой кодировке (СP_UTF16=1200), и использует одну из них по обстоятельствам.
При работе с однобайтными строками (string) все ок: происходит копирование строки без всяких изменений из исходного файла, и если исходный файл в utf8 кодировке - лазарус воспринимает их как родные... (однако не будет работать ни с какой другой кодировкой исходного файла, например с cp1251, потребуется ручная перекодировка констант в строки utf8).
При работе с двухбайтными строками (UnicodeString/WideString) есть 2 варианта:
1. Исходный .pas файл содержит UTF8 BOM префикс (Byte Order Mark = [$EF,$BB,$BF]), в этом случае для создания двухбайтных констант компилятор конвертирует строку из исходного файла из кодировки utf8 в кодировку utf16. И при использовании UnicodeString все ок.
2. Исходный файл не содержит префикса, и тогда для создания двухбайтных констант компилятор просто переносит каждый байт строки из файла в WideChar константы двухбайтной кодировки, что неверно для символов с кодами >=128 (т.е. для любых символов не входящих в ASCII).
Таким образом при использовании локализованных строковых констант требуется, чтобы исходный файл был не только в кодировке utf8, но и содержал UTF8 BOM префикс! Это не будет критично при использовании только однобайтных строк (string), но приведет к прблемам при использовании таких констант с переменными UnicodeString/WideString или параметрами процедур/функций/методов с этими типами. Это касается и непосредственно заданных констант без предварительного объявления, например: S:='Строка'; или Foo('Строка');
Возможно имеется опция компилятора, позволяющая принудительно указать кодировку для файлов без префиксов для корректного формирования строковых констант, может кто подскажет?