ANSI申请和越南代码页

时间:2012-06-29 14:10:36

标签: delphi localization delphi-7


  1. 我按照this site
  2. 的说明将我的系统代码页更改为俄语
  3. PC重新启动
  4. 然后,我在dir中创建了一个文件,其名称包含特殊的俄文字符
  5. 然后,我列出了这个目录中的所有文件,并尝试使用典型的Delphi 7代码显示该文件:

  6.  SearchRec: TSearchRec;
    
      FindFirst
    
      showmessage(SearchRec.Name);
    
      FindNext(SearchRec);
      FindClose(SearchRec);
    

    代码效果很好。

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

    enter image description here

    请帮忙

1 个答案:

答案 0 :(得分:1)

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

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

以下是您的案例:

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

所以你有几个解决方法:

  • 升级到Delphi> = 2009,您的string将是UNICODE,因此您可以混合字符集;
  • 使用widestring存储您的文字,直接调用Windows范围的API - 也就是说,您不能使用FindFirst/FindNext中定义的VCL单位或SysUtils,也不能{ {1}}中定义的{1}}。

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