【发布时间】: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 不允许在没有外部工具的情况下这样做呢?
【问题讨论】:
-
这个答案stackoverflow.com/a/2947349/368364 可能会给你一个更大的画面。
-
这也可能是相关的superuser.com/questions/167950/…
-
没有XE10这样的东西
标签: delphi unicode locale firebird non-unicode