在OSX上FPC字符串到宽字符串转换

时间:2015-03-08 22:56:24

标签: macos utf-8 lazarus fpc

OSX上的WideString转换对我不起作用。

在一个大型程序中,假设所有string都是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-only转换,但我不知道为什么OSX总是使用UTF-8。

包括cwstring一无所取。那里安装了/usr/lib/libiconv.2.4.0.dylib。通过-liconv添加它也不会发生任何变化。

OSX 10.8上的Lazarus 1.2.6和FPC 2.6.4。有什么方法可以使自动转换工作吗?

1 个答案:

答案 0 :(得分: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制作我自己的UTF-8版本。这肯定不好,但它是正确的(程序总是假设字符串是UTF-8我真的认为没有理由为什么程序内部应该依赖于操作系统而且工作正常。

与此同时,FPC中的文件已更改,因此可能是fixed already