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

Posted

技术标签:

【中文标题】如何获得完整的 unicode 支持,包括 VCL 控件中的中文字符或 XP 上的 Windows 通用控件,就像在 Win7 中一样【英文标题】:How do I get full unicode support including chinese characters in VCL controls or Windows Common Controls on XP like it is in Win7 【发布时间】:2011-07-20 17:24:52 【问题描述】:

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

例如,有一个标准的 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 在进行如下图所示的测试时也会出现问题:

    人们会怎么做?

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

更新:Microsoft 术语“补充语言支持”似乎是指 Windows 的“Windows 不会将我的 Unicode 字符显示为框”功能。

【问题讨论】:

在 Windows 资源管理器中也是如此。 XP 中的盒子很多,但在 Vista/7 中很漂亮。 看来,Windows 7 的国际化体验有更多的想法? 我知道。但是人们可能仍然希望您的应用程序能够很好地工作。大型企业运营,可能仍在使用 XP,去年才从 Windows 2000 升级。 我只是一个低级的专业软件开发人员。当客户停止购买软件,不再要求它在 XP 上运行时,我将停止支持它! :-) @David - 因为它可能有效?您的客户使用软件来完成工作,而不仅仅是为了使用最新最好的软件。软件开发人员是所有计算机用户中非常有限的一个子集,它确实服务于那个较小的子集和我们正确服务于更大的超集以记住这一点的能力。如果您不了解您的客户为什么使用某些软件,那么您就不够了解您的客户,恕我直言。 【参考方案1】:

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

您可以通过使用LGRIP_INSTALLED 标志检查其中一种相关语言来检测它们是否已使用IsValidLanguageGroup 安装:

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;

【讨论】:

+1 我认为您可以放心地假设您的任何经常使用此类字符的用户都已经这样做了! 我不知道这些选项启用了字体链接 有没有办法检测特定的 XP 系统是否启用了字体链接? 好吧,看起来字体链接只是被称为补充语言支持的技术的一部分。这是检测它的特定代码:***.com/questions/3434234/… 和一个微软人实际上推荐这种方法:blogs.msdn.com/b/michkap/archive/2006/02/10/529867.aspx 我认为这个答案确实是正确的,但我认为“字体链接”的提及是不必要的技术性和潜在的混乱。一个简单的事实肯定是,Windows 7 包括“开箱即用”的亚洲语言支持,但这必须在 Windows XP 上专门启用/安装(根据描述的“语言支持选项”)。

以上是关于如何获得完整的 unicode 支持,包括 VCL 控件中的中文字符或 XP 上的 Windows 通用控件,就像在 Win7 中一样的主要内容,如果未能解决你的问题,请参考以下文章

如何“扫描”当前安装的 VCL 组件的完整列表

无论如何都可以获得任何网站的完整呈现的 HTML 代码(包括 JavaScript 代码)?

PhpStorm 和 JavaScript:如何获得完整的文档支持

如何获得每天包含多个列的事件的第一个实例,包括日期时间并返回这些列加上完整的日期时间值?

unicode包括五笔字根吗

我如何获得完整的网址