我的 Delphi(XE 10)程序使用非 Unicode(单字节)遗留 Firebird 数据库(字符集为 NONE),因此其从数据库读取或保存的数据取决于 Windows 区域设置对于非 Unicode 程序的设置。根据这个 Windows 设置,同一个数据库字符可以在程序中显示为 \u0101(是正确的)或 \u0432(不正确)。IBX 用作 DB 访问技术。
我的程序仅适用于指定的非 Unicode 程序本地化,这对客户来说是可以接受的。问题是 - 如何使程序感知特定预定义的语言环境,而不管 Windows 的设置如何?
我想我应该使用
由于评论提到了 GetThreadLocale 返回的值与 GetUserDefaultLCID 不同? 我现在看到我应该写更多的代码:
但主要问题仍然存在——在哪里放置此代码——我有WebSnap应用程序,我猜它可以在幕后进行自动和复杂的线程管理。代码应该放在哪里?
什么都没有帮助:
- 在TIBDatabase.Params中添加lc_ctype=WIN1257 - 设置SetThreadLocale... 这里、那里和所有地方 - 设置Project Options - Version Info - Language - Locale ID
Locale Emulator是唯一解决问题的工具,但为什么Delphi不允许在没有外部工具的情况下完成这个操作呢?https://github.com/xupefei/Locale-Emulator
我的程序仅适用于指定的非 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