0

  1. 如本网站所述,我已将系统的代码页更改为俄语
  2. 电脑重新启动
  3. 然后,我在目录中创建了一个文件,其名称包含特殊的俄语字符
  4. 然后,我列出了此目录中的所有文件,并尝试使用典型的 Delphi 7 代码显示该文件:

 SearchRec: TSearchRec;

  FindFirst

  showmessage(SearchRec.Name);

  FindNext(SearchRec);
  FindClose(SearchRec);

代码运行良好。

当我用越南语而不是俄语重做所有 4 个步骤时,显示消息的文件名不正确。反而出现了一些?(见截图):

在此处输入图像描述

请帮忙

4

1 回答 1

1

这是由于 2009 年之前的 Delphi 版本实现其string类型的方式。不是字体的问题,而是字符编码的问题。

所有string变量以及所有 Windows API 调用都使用 ANSI 编码执行。使用 ANSI,您一次只能使用一个代码页。为了混合代码页(即混合俄罗斯和越南编码),您需要处理文本并调用 UNICODE Windows API。

这是您的案例中发生的情况:

  • 您通过 Windows 使用 UNICODE 编码创建一个带有俄语字符的文件;
  • 当您使用越南语当前代码页读取文件时,只有前 127 个字符(即 ASCII 七个字符,例如数字、主要标点和英文字母)能够从 UNICODE 读取到 ANSI 越南语:在转换过程中,所有不正确的字符转换为 ? 在您的 ANSI 越南语字符串中。

因此,您有几种解决方法:

  • 升级到 Delphi >= 2009,你string将是 UNICODE,所以你将能够混合字符集;
  • 用于存储您的文本,并直接调用 Windows范围的API——widestring也就是说,您不能使用 VCL 单元,也不能使用.FindFirst/FindNextSysUtilsShowMessageDialogs

当然,第一个是最简单的!

于 2012-06-29T18:20:03.237 回答