我正在用 Lazarus (1.5) fpc (3.1.1) 编写一个针对 Windows XP/7/10 的应用程序。我的应用程序在用户选择的某些路径中读取和写入文件系统中的文件。如果路径或文件名包含特殊字符(如 à è é),例如:
C:\Users\DeAndrè\out.txt
应用程序引发异常:
'EFCreateError' 无法创建文件“C:\Users\DeAndrè\out.txt”。
可以通过编写一个带有单一表单的简单应用程序来重现此问题:将一个 TListBox (ListBox1)、两个 TButton(Button1 和 Button2)和一个 TSaveDialog (SaveDialog1) 拖入表单中。
在Button1的OnClick事件中(仅用于在ListBox1上写入一些数据):
procedure TForm1.Button1Click(Sender: TObject);
begin
// Simple Add Hello to ListBox
ListBox1.Items.Add('Hello '+IntToStr(ListBox1.Items.Count));
end;
在 Button2 的 OnClick 事件中:
procedure TForm1.Button2Click(Sender: TObject);
begin
if SaveDialog1.Execute then
begin
ListBox1.Items.SaveToFile(SaveDialog1.FileName);
end;
end;
运行应用程序并单击“Button1”几次(只是为了在列表中添加一些单词)然后单击 Button2 并尝试将内容保存到包含特殊字符的路径...
我注意到,如果我用函数 UTF8ToAnsi 转换 FileName 它工作,但为什么呢?Windows 文件系统不是 UTF8?
有“标准”的解决方案吗?例如设置应用程序以正确模式或类似模式使用文件系统?
谢谢
在 Rudy 和 David 的指导下,我找到了解决方案:要使 Lazarus 能够使用 UnicodeAPI,您必须在“自定义选项”上添加-dEnableUTF8RTL:
在“项目”->“项目选项”->“添加和覆盖”上
单击“添加”->“自定义选项”并添加
-dEnableUTF8RTL
这会强制编译器使用 Unicode 进行文件系统访问。
也可以单击“在 RTL 中设置 UTF8”按钮。除了 -dEnableUTF8RTL 之外,此按钮还添加了以下选项:
-FcUTF8
在 Lazarus 论坛的这个链接中:http : //forum.lazarus.freepascal.org/index.php?topic=27240.0有一个关于 Lazarus 和 UTF8 的“Wiki”页面的摘录:
通常 RTL 使用系统代码页作为字符串(例如 FileExists 和 TStringList.LoadFromFile)。在 Windows 上,这是一种非 Unicode 编码,因此您只能使用您的语言组中的字符。LCL 使用 UTF-8 编码,这是完整的 Unicode 范围。在 Linux 和 Mac OS X 上,UTF-8 通常是系统代码页,因此 RTL 在这里默认使用 CP_UTF8。
从 FPC 2.7.1 开始,RTL 的默认系统代码页可以更改为 UTF-8 (CP_UTF8)。因此,Windows 用户现在可以在 RTL 中使用 UTF-8 字符串。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句