Преобразование в/из WideString
на OSX для меня не работает.FPC-строка для преобразования в широте на OSX
В большой программе все string
s предполагается UTF-8, и все работает нормально. Недавно была добавлена библиотека с использованием WideString
, и она отлично работает в Linux, но не работает на OSX. Все символы, отличные от ASCII, заменяются вопросительными знаками (не некоторыми странными символами, а именно U + 003F), независимо от того, какое направление используется. Я мог бы извлечь эту проблему в следующем фрагменте:
VAR s: String; ws: WideString;
...
s := 'Maß'; // A string with some non-ASCII character
ws := LazUTF8.UTF8ToUTF16(s); // Works fine.
// ws := s; // *** Uncomment this and fail.
s := LazUTF8.UTF16ToUTF8(ws); // Works fine.
// s := ws; // *** Uncomment this and fail.
IF Pos('?', s) > 0 THEN RAISE Exception.Create('Blown!');
раскомментировав одна или обе линии, отмеченные ***
приводит к исключению. Похоже, что используется какое-то стандартное преобразование только для ASCII, но я понятия не имею, почему, как говорят, OSX всегда использует UTF-8.
Включая cwstring ничего не меняет. Там установлен /usr/lib/libiconv.2.4.0.dylib
. Добавление его через -liconv
явно ничего не меняет.
Это Lazarus 1.2.6 и FPC 2.6.4 на OSX 10.8. Любой способ сделать автоматическое преобразование работать?
две вещи: [1] UTF8ToUTF16 возвращает строку юникода, а не самую широкую. Widestrings не являются строками unicode: они просто как ansistring, но с 2 байтами на символы (они должны быть уже декодированы). строка в Юникоде физически подобна ansistring, но char не обязательно является точкой кода, у вас может быть меньше символов unicode, содержащихся в этой строке. [2]: endianess? –
@BBaz Спасибо. Я знаю, что не все вписывается в два байта, но меня не интересует такая экзотика. Разница между строкой unicode и widestring не совсем ясна для меня. Endianess не может объяснить, почему вопросительные знаки генерируются обоими преобразованиями. Это была тяжелая отладка, но я нашел преступника. – maaartinus