Lazarus ListBox SaveToFile 带有特殊字符的文件名

安德烈博克

我正在用 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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

带有特殊字符的文件名

来自分类Dev

错误 lazarus 或不支持字符

来自分类Dev

具有Lazarus freepascal的XML-RPC

来自分类Dev

具有Lazarus freepascal的XML-RPC

来自分类Dev

删除文件名中带有特殊字符的目录

来自分类Dev

处理带有特殊首字符的文件名(例如♫)

来自分类Dev

Spire PDF SaveToFile崩溃程序

来自分类Dev

#127以上的Delphi / Windows和Linux / Lazarus共享字符

来自分类Dev

Lazarus / FreePascal,Synapse将文件发送到TCPBlockSocket

来自分类Dev

lazarus / delphi(pascal)-写入txt文件,下次不覆盖

来自分类Dev

Lazarus / FreePascal,Synapse将文件发送到TCPBlockSocket

来自分类Dev

Linux Lazarus:TFileStream 报告的文件大小错误

来自分类Dev

拉撒路(Lazarus)中有GetMouseMovePointsEx函数吗?

来自分类Dev

os.listdir返回带有特殊字符的文件名的奇怪字符串

来自分类Dev

无法删除/移动文件名中带有特殊字符的文件

来自分类Dev

pandas:文件路径和文件名中带有重音/特殊字符的 oserror

来自分类Dev

jQuery File Upload-带有特殊字符的blueimp文件名

来自分类Dev

python子进程模块无法解析带有特殊字符“(”的文件名

来自分类Dev

python子进程模块无法解析带有特殊字符“(”的文件名

来自分类Dev

jQuery File Upload-带有特殊字符的blueimp文件名

来自分类Dev

从Content-Disposition标头中提取带有特殊字符的文件名

来自分类Dev

如何在Linux中连续创建带有特殊字符(如()和空格)的文件名?

来自分类Dev

在“超越比较”中,如何排除带有特殊字符的文件名?

来自分类Dev

正则表达式:如何获取带有特殊字符的完整文件名

来自分类Dev

awk 在 *system call* 中处理带有特殊字符的文件名

来自分类Dev

如何使用Lazarus将HTML表格文件打开为(字符串)网格?

来自分类Dev

更改bash中具有特殊字符的文件名

来自分类Dev

Python Tkinter Listbox 文件实现

来自分类Dev

如何在Lazarus中打开与特定TCP端口的TCP连接,发送字符串并读取响应?

Related 相关文章

  1. 1

    带有特殊字符的文件名

  2. 2

    错误 lazarus 或不支持字符

  3. 3

    具有Lazarus freepascal的XML-RPC

  4. 4

    具有Lazarus freepascal的XML-RPC

  5. 5

    删除文件名中带有特殊字符的目录

  6. 6

    处理带有特殊首字符的文件名(例如♫)

  7. 7

    Spire PDF SaveToFile崩溃程序

  8. 8

    #127以上的Delphi / Windows和Linux / Lazarus共享字符

  9. 9

    Lazarus / FreePascal,Synapse将文件发送到TCPBlockSocket

  10. 10

    lazarus / delphi(pascal)-写入txt文件,下次不覆盖

  11. 11

    Lazarus / FreePascal,Synapse将文件发送到TCPBlockSocket

  12. 12

    Linux Lazarus:TFileStream 报告的文件大小错误

  13. 13

    拉撒路(Lazarus)中有GetMouseMovePointsEx函数吗?

  14. 14

    os.listdir返回带有特殊字符的文件名的奇怪字符串

  15. 15

    无法删除/移动文件名中带有特殊字符的文件

  16. 16

    pandas:文件路径和文件名中带有重音/特殊字符的 oserror

  17. 17

    jQuery File Upload-带有特殊字符的blueimp文件名

  18. 18

    python子进程模块无法解析带有特殊字符“(”的文件名

  19. 19

    python子进程模块无法解析带有特殊字符“(”的文件名

  20. 20

    jQuery File Upload-带有特殊字符的blueimp文件名

  21. 21

    从Content-Disposition标头中提取带有特殊字符的文件名

  22. 22

    如何在Linux中连续创建带有特殊字符(如()和空格)的文件名?

  23. 23

    在“超越比较”中,如何排除带有特殊字符的文件名?

  24. 24

    正则表达式:如何获取带有特殊字符的完整文件名

  25. 25

    awk 在 *system call* 中处理带有特殊字符的文件名

  26. 26

    如何使用Lazarus将HTML表格文件打开为(字符串)网格?

  27. 27

    更改bash中具有特殊字符的文件名

  28. 28

    Python Tkinter Listbox 文件实现

  29. 29

    如何在Lazarus中打开与特定TCP端口的TCP连接,发送字符串并读取响应?

热门标签

归档