为整个Delphi应用程序设置线程区域设置

3
我的 Delphi(XE 10)程序使用非 Unicode(单字节)遗留 Firebird 数据库(字符集为 NONE),因此其从数据库读取或保存的数据取决于 Windows 区域设置对于非 Unicode 程序的设置。根据这个 Windows 设置,同一个数据库字符可以在程序中显示为 \u0101(是正确的)或 \u0432(不正确)。IBX 用作 DB 访问技术。
我的程序仅适用于指定的非 Unicode 程序本地化,这对客户来说是可以接受的。问题是 - 如何使程序感知特定预定义的语言环境,而不管 Windows 的设置如何?
我想我应该使用 SetThreadLocale 来实现这一点。但是在哪里调用这个函数? 在主窗体的初始化部分调用这个函数是否就足够了,还是应该在项目源文件(应用程序初始化的位置)中调用它,或者可能应该在每个模块的初始化部分调用它?
由于评论提到了 GetThreadLocale 返回的值与 GetUserDefaultLCID 不同? 我现在看到我应该写更多的代码:
SetThreadLocale(my_preferred_locale_id); 
SysLocale.DefaultLCID := my_preferred_locale_id; 
GetFormatSettings;

但主要问题仍然存在——在哪里放置此代码——我有WebSnap应用程序,我猜它可以在幕后进行自动和复杂的线程管理。代码应该放在哪里?
什么都没有帮助:
- 在TIBDatabase.Params中添加lc_ctype=WIN1257 - 设置SetThreadLocale... 这里、那里和所有地方 - 设置Project Options - Version Info - Language - Locale ID
Locale Emulator是唯一解决问题的工具,但为什么Delphi不允许在没有外部工具的情况下完成这个操作呢?https://github.com/xupefei/Locale-Emulator

1
这个答案https://dev59.com/BnI-5IYBdhLWcg3wm5vN#2947349 或许能够给你更全面的了解。 - RBA
1
这可能也与之相关 http://superuser.com/questions/167950/changing-windows-locales-on-a-per-process-basis - JensG
没有XE10这个东西。 - David Heffernan
1个回答

2

我也在Firebird-support邮件列表上发了同样的帖子(有趣的是,那里的张贴者名字不同,但问题相同):

在我看来,除了你的数据库使用NONE之外,你还连接了字符集NONE。为解决此问题,明确指定lc_ctype = win1257应该就足够了。

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


不,这没有帮助! - TomR
Delphi 10 Seattle忽略了lc_ctype,只有在lc_ctype指定不存在的字符集(或小写格式)时才报告不正确的值。否则它不起作用。难以置信,但这确实发生在Delphi中。 - TomR
@TomR 也许你应该考虑将数据库明确设置为WIN1257(或者UTF8),并使用UTF8连接。 - Mark Rotteveel
项目的限制不允许进行此类更改。当然,在其他项目中我曾经这样做过,而且结果是值得投资的,但可悲的是,这种情况下不被允许。 - TomR
@TomR 那我只能建议您在这个问题中添加更多细节,比如连接配置使用的情况、一些代码等等。也许有实际 Delphi 经验的人会提出一个实际的解决方案。 - Mark Rotteveel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接