【问题标题】:SetThreadLocale for the entire Delphi application整个 Delphi 应用程序的 SetThreadLocale
【发布时间】:2017-06-28 12:41:24
【问题描述】:

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

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

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

由于 cmets 我被告知GetThreadLocale returns different value than 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-EmulatorLocale Emulator 是唯一可以解决问题的工具,但为什么 Delphi 不允许在没有外部工具的情况下这样做呢?

【问题讨论】:

标签: delphi unicode locale firebird non-unicode


【解决方案1】:

我也在 Firebird 支持邮件列表上发帖(奇怪的是,那里的发帖人名字不同,但问题相同):

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

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

【讨论】:

  • 不,这没有帮助!
  • Delphi 10 Seattle 会忽略此 lc_ctype,如果 lc_ctype 指定不存在的字符集(或小写格式),它只会报告不正确的值。否则它不起作用。难以置信,但它发生在 Delphi 上。
  • @TomR 也许您应该考虑将数据库更改为明确的 WIN1257(或者可能是 UTF8),并改为使用 UTF8 连接。
  • 项目限制不允许这样的改变。当然,我在其他项目中也这样做过,结果值得投资,但遗憾的是,在这种情况下是不允许的。
  • @TomR 那我只能建议你在这个问题上添加更多细节,比如使用的连接配置、一些代码等。也许有实际Delphi经验的人会想出一个实际的解决方案。跨度>
猜你喜欢
  • 1970-01-01
  • 2011-03-04
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 2010-11-13
  • 1970-01-01
  • 2011-02-22
  • 2010-11-05
相关资源
最近更新 更多