Delphi 7中的用户语言支持

use*_*591 0 delphi delphi-7 internationalization

我的程序是用Delphi 7编写的,我想避免俄语或中文,韩语尝试使用我的软件,因为文件路径包含Unicode字符,我的程序无法处理它们(只要我不在我的程序上移植我的程序)新的Delphi版本支持UNICODE).

如何在Delphi 7中编写检测"Unicode语言"的函数?

Arn*_*hez 5

Delphi 7程序(在其VCL部分中)可以毫无问题地处理俄语,中文或韩语字符.

如果正确设置了Windows系统语言,则字符集将匹配相应的编码,并且文件名将能够具有此字符集中可用的Unicode字符.实际上,string=AnsiString当VCL调用Windows API时,默认值将转换为Unicode(所有....A()调用都将执行转换,然后调用....W()版本).

您可以强制 默认代码页通过调用代码(其中一个将选择字符集被使用)这样的:

if GetThreadLocale<>LCID then // force locale settings if different
  if SetThreadLocale(LCID) then
    GetFormatSettings; // resets all locale-specific variables
Run Code Online (Sandbox Code Playgroud)

在这种情况下,当前系统字符集中的TFileName(= AnsiString)将由Windows转换为相应的Unicode字符,您将能够在Delphi 7应用程序中使用它.

由于新的默认范例,自Delphi 2009以来,标准VCL AnsiString无法用它来直接混合字符集string = UnicodeString.

PS:

由于CharSet只涉及#128 ..#255 chars(即所有第7位设置),如果只使用#0 ..#127 chars,无论当前的字符集/代码页设置是什么,你的字符串都是一致的.如果你只使用英文字符和数字,你的路径将始终有效,无论字符集/代码页是什么.但是,如果使用非英语字符,则路径仅在正确设置字符集/代码页时才有效,这是最终用户使用的路径(TOpenDialog例如,在运行时使用).

  • 用户,我不认为你已经意识到unicode路径在任何地方都会发生的简单事实,即使在美国也是如此.您可以在任何地方打破完全相同的数量,也可以向上移植到Unicode delphi版本. (3认同)
  • @ user382591 FILEEXISTS()将使用在Delphi 7,其将被Windows(使用当前代码页/字符集)被转换为Unicode文件名称的TFileName = AnsiString类型参数搜索该文件时.所以,是的,FileExists()总是使用unicode路径,具体取决于当前的字符集. (2认同)