OSX 上的 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转换,但我不知道为什么据说OSX总是使用UTF-8。

包括 cwstring 根本没有改变任何东西。那里安装了/usr/lib/libiconv.2.4.0.dylib。通过-liconv添加它也不会明确改变任何内容。

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

罪魁祸首是线条

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

nl_langinfo(CODESET)一起cwstring.pp返回US-ASCII.不知道为什么会这样,但我的解决方案是制作我自己的cwstring.pp版本,其中包含硬编码UTF-8。这当然不是很好,但它是正确的(程序总是假设字符串是UTF-8的,我真的看不出为什么程序内部应该依赖于操作系统)并且工作正常。

同时,FPC中的文件已更改,因此可能已经修复。

最新更新