3

我的 Delphi (XE 10) 程序使用非 unicode(单字节)遗留 Firebird 数据库(字符集 NONE),因此其数据(从数据库中读取或保存到数据库中)取决于非 unicode 程序的 windows 区域设置。根据此 Windows 设置,相同的数据库字符可以在程序中显示为 \u0101(正确)或 \u0432(不正确)。IBX 用作数据库访问技术。

我的程序仅适用于非 unicode 程序的特定本地,并且客户端可以接受。问题是 -无论 Windows 设置如何,如何让程序感受特定的预定义语言环境?

我想我应该用SetThreadLocale这个。但是在哪里打这个电话?在主窗体的初始化部分调用这个函数是否足够,或者我应该在项目源文件(应用程序被初始化的地方)调用它,或者我应该在每个模块的初始化部分调用它?

由于评论,我知道GetThreadLocale 返回的值与 GetUserDefaultLCID 不同? 我现在看到我应该多写一点代码:

SetThreadLocale(my_preferred_locale_id); 
SysLocale.DefaultLCID := my_preferred_locale_id; 
GetFormatSettings;

但主要问题仍然存在 - 将这段代码放在哪里 - 我应该把它放在多个地方。我有 WebSnap 应用程序,我想它可以在引擎盖下进行自动和复杂的胎面管理。代码应该去哪里?

没有什么帮助:

  • 将 lc_ctype=WIN1257 添加到 TIBDatabase.Params
  • 设置 SetThreadLocale... 这里、那里和任何地方
  • 设置项目选项 - 版本信息 - 语言 - 区域设置 ID

https://github.com/xupefei/Locale-Emulator Locale Emulator 是唯一可以解决问题的工具,但为什么 Delphi 不允许在没有外部工具的情况下执行此操作?

4

1 回答 1

2

正如我还在 Firebird 支持邮件列表上发布的那样(奇怪的是那里的海报有不同的名字,但同样的问题):

在我看来,除了使用 NONE 的数据库之外,您还使用字符集 NONE 进行连接。要解决这个问题,明确指定 lc_ctype = win1257 就足够了。

我不太了解 Delphi,但假设 Delphi 在内部使用 unicode,那么它应该可以工作。

于 2017-02-10T09:13:05.233 回答