2015-03-08 3 views
2

Преобразование в/из 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. Любой способ сделать автоматическое преобразование работать?

+0

две вещи: [1] UTF8ToUTF16 возвращает строку юникода, а не самую широкую. Widestrings не являются строками unicode: они просто как ansistring, но с 2 байтами на символы (они должны быть уже декодированы). строка в Юникоде физически подобна ansistring, но char не обязательно является точкой кода, у вас может быть меньше символов unicode, содержащихся в этой строке. [2]: endianess? –

+0

@BBaz Спасибо. Я знаю, что не все вписывается в два байта, но меня не интересует такая экзотика. Разница между строкой unicode и widestring не совсем ясна для меня. Endianess не может объяснить, почему вопросительные знаки генерируются обоими преобразованиями. Это была тяжелая отладка, но я нашел преступника. – maaartinus

ответ

0

Виновником являются линии

iconv_wide2ansi:=iconv_open(nl_langinfo(CODESET), unicode_encoding2); 
iconv_ansi2wide:=iconv_open(unicode_encoding2, nl_langinfo(CODESET)); 

в cwstring.pp вместе с nl_langinfo(CODESET) возвращения US-ASCII. Не знаю, почему это происходит, но мое решение состояло в том, чтобы сделать мою собственную версию cwstring.pp с hardcoded UTF-8 дюйма. Это, конечно, не очень хорошо, но это правильно (программа всегда предполагает, что строки имеют значение UTF-8, и я действительно не вижу причин, по которым внутренние программы должны быть Зависит от ОС) и работает нормально.

В то же время файл в FPC изменился, так что это могло быть fixed already.

+0

FPC3 позволяет установить глобальную кодовую страницу. –