如何获得完整的unicode支持,包括VCL控件中的中文字符或XP上的Windows公共控件,就像在Win7中一样

War*_* P 3 windows delphi windows-xp internationalization common-controls

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

例如,有一个标准的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的"窗口不显示我的unicode字符作为框"功能.

Zoë*_*son 6

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

您可以通过使用标志检查其中一个相关语言来检测是否已使用IsValidLanguageGroup安装它们LGRIP_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;
Run Code Online (Sandbox Code Playgroud)

  • 好吧,看起来像字体链接只是被称为补充语言支持的技术的一部分.以下是检测它的具体代码:http://stackoverflow.com/questions/3434234/detect-if-any-right-to-left-language-is-installed/3434825#3434825,微软的人实际上推荐了这种方法:http ://blogs.msdn.com/b/michkap/archive/2006/02/10/529867.aspx (2认同)