【问题标题】:Programmatically change the default code page in Windows XP? (from Delphi)以编程方式更改 Windows XP 中的默认代码页? (来自德尔福)
【发布时间】:2010-06-09 16:14:50
【问题描述】:

谁能建议如何以编程方式更改默认的 Windows XP 代码页(我是从 Delphi 做的)? (这相当于进入控制面板 -> 区域设置 -> 非 Unicode 应用程序的语言)。

在这种情况下,我想切换到中文 (PRC),因此我正在写入以下注册表字符串: HKLM\SYSTEM\CurrentControlSet\Control\Nls\CodePage\ ACP=936 MACCP=10008 OEMCP=936

(这正是在控制面板中更改非 Unicode 代码页下拉菜单所做的事情)。必须有另一个设置需要更改 - 我更愿意使用 Win API 调用(如果可用)而不是自己写入注册表。

我也试过设置 HKLM\SYSTEM\CurrentControlSet\Control\Nls\Language\ 默认=0804(中国PRC)无效。

我不想更改“语言环境”本身,因为这也会更改时间/日期设置、分隔符等。

这是因为我正在使用一个需要渲染中文字符的 ANSI 应用程序,并且我正在编写一个工具来自动切换系统显示字符(同时保持 UI 的其他方面不变)。

谢谢!

邓肯

【问题讨论】:

    标签: delphi localization codepages


    【解决方案1】:

    唯一合适的情况是,如果您正在编写一个不会在系统上运行其他任何东西的信息亭类型的应用程序。该更改将影响系统上的所有其他应用程序。

    如果您只需要渲染字符并将它们放入 WideString 中,您可以通过直接调用 Windows API 的 W 版本在旧版本的 Delphi 中渲染它们,而不是通过TCanvas 方法。也就是说,调用DrawTextW 或ExtTextOutW 而不是TCanvas.TextOut,它将绘制Unicode 字符而不将它们转换为系统的ANSI 代码页。

    更完整的选项是TMS Unicode Component Pack。它支持在 Delphi 6-2007 中制作支持 Unicode 的应用程序,并为您处理调用所有 W 函数。它运行良好,您可以像平常一样使用 TCanvas 或 Caption/Text 属性。唯一的区别是属性都是 WideStrings 而不是。这最初是 TNT Unicode 控件包,并且有一个旧的、不受支持的可用版本here。

    最后,您可以使用 Microsoft 的 AppLocale 实用程序为您的应用程序更改 ANSI 代码页。有关于从批处理脚本here 调用它的详细信息,一个在没有唠叨屏幕的情况下运行它的补丁here,以及一个名为SBAppLocale 的命令行克隆。它有效,但它是一个 hack,而且其他选项更适合长期使用。

    【讨论】:

    • Craig - 是的,这是一个控制台应用程序,我们的软件是在 PC 上运行的唯一可见应用程序(除了 windows shell)。有问题的 ANSI 软件已经编写好了,我无法更改它(对于这种情况)。我只是在编写一个单独的实用程序来切换 Windows 代码页。 AppLocale 看起来不错。我仍然认为最好的解决方案是切换非 unicode 代码页 - 但我很难做到这一点,而无需手动单击控制面板 - > 区域设置中的下拉选项。无论哪种方式,非常感谢您提供的大量解决方案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多