3

我有一个我一直在测试国际化支持的应用程序。

例如,有一个标准的 TEdit 控件,其 font.Name = 'Arial'。

在 Windows 7 上,如果分配给该控件的字体不包含某个国际字符,它似乎会自动从 Arial Unicode MS 或其他地方抓取 CJK 字符的字形,用于 EDIT 通用控件。

在 Windows XP 上,即使安装了 Arial Unicode MS 字体,中文字符似乎也显示为框,除非我将 delphi 形式的字体名称更改为 Arial Unicode MS。

这是每个人在 Windows XP 上使用国际字体支持时都会遇到的问题吗?Windows 常用控件的行为是否不同?我在 Windows 7 上看到的行为肯定比我在 Windows XP 上看到的行为更友好。

这种行为差异不仅限于 Windows 公共控件。似乎即使是 Internet Explorer 和 MS Explorer shell 在进行如下图所示的测试时也会出现问题: 在此处输入图像描述

  1. 人们对此怎么办?

  2. Windows XP 上的预期平台行为是什么?您是否必须找到用户想要使用的语言,然后找到支持该语言的字体供他们使用?我猜 Arial Unicode MS 可能是一个很好的默认设置,因为它几乎包含所有的 unicode 语言。

更新:看起来微软术语“补充语言支持”是指 Windows 的“Windows 不会将我的 Unicode 字符显示为框”功能。

4

1 回答 1

6

Vista 和 Windows 7 包括对东亚语言的开箱即用支持。要在 Windows XP 上启用它,请进入控制面板,打开区域和语言选项对话框,切换到语言选项卡,然后检查补充语言支持的东亚语言安装文件

您可以通过检查带有标志的相关语言之一来检测它们是否已使用IsValidLanguageGroupLGRIP_INSTALLED安装:

uses
  Windows;

type
  LGRPID = DWORD;

const
  LGRPID_INSTALLED = $00000001;  // installed language group ids
  LGRPID_SUPPORTED = $00000002;  // supported language group ids

  LGRPID_WESTERN_EUROPE       = $0001; // Western Europe & U.S.
  LGRPID_CENTRAL_EUROPE       = $0002; // Central Europe
  LGRPID_BALTIC               = $0003; // Baltic
  LGRPID_GREEK                = $0004; // Greek
  LGRPID_CYRILLIC             = $0005; // Cyrillic
  LGRPID_TURKISH              = $0006; // Turkish
  LGRPID_JAPANESE             = $0007; // Japanese
  LGRPID_KOREAN               = $0008; // Korean
  LGRPID_TRADITIONAL_CHINESE  = $0009; // Traditional Chinese
  LGRPID_SIMPLIFIED_CHINESE   = $000a; // Simplified Chinese
  LGRPID_THAI                 = $000b; // Thai
  LGRPID_HEBREW               = $000c; // Hebrew
  LGRPID_ARABIC               = $000d; // Arabic
  LGRPID_VIETNAMESE           = $000e; // Vietnamese
  LGRPID_INDIC                = $000f; // Indic
  LGRPID_GEORGIAN             = $0010; // Georgian
  LGRPID_ARMENIAN             = $0011; // Armenian

function IsValidLanguageGroup(LanguageGroup: LGRPID; dwFlags: DWORD): BOOL; stdcall;
  external kernel32;

function IsCJKInstalled: Boolean;
begin    
  Result := IsValidLanguageGroup(LGRPID_SIMPLIFIED_CHINESE, LGRPID_INSTALLED);
end;
于 2011-03-22T18:45:28.060 回答