My Delphi(XE 10)程序使用nonunicode(单字节)传统Firebird数据库(字符集NONE),因此其数据(从数据库读取或保存到数据库中)取决于非语言程序的Windows Locale。根据此Windows设置,相同的数据库字符可以在程序中显示为\ u0101(正确)或\ u0432(不正确)。 IBX用作数据库访问技术。
我的程序仅适用于nonunicode程序的特定本地,并且对于客户端是可接受的。问题是 - 如何让程序感受到特定的预定义语言环境,而不管Windows设置如何?
我想我应该使用SetThreadLocale
。但是在哪里进行此调用?在Main表单的初始化部分调用此函数是否足够,或者我应该在项目源文件中调用它(应用程序初始化的地方)或者我应该调用它它在每个模块的初始化部分?
由于评论我被告知GetThreadLocale returns different value than GetUserDefaultLCID? 我现在看到我应该写更多的代码:
SetThreadLocale(my_preferred_locale_id);
SysLocale.DefaultLCID := my_preferred_locale_id;
GetFormatSettings;
但主要问题仍然存在 - 在哪里放置此代码 - 我应该把它放在多个地方。我有WebSnap应用程序,我猜它可以进行自动和复杂的胎面管理。代码应该去哪里?
没有任何帮助:
https://github.com/xupefei/Locale-Emulator Locale Emulator是解决问题的唯一工具,但是为什么Delphi不允许在没有外部工具的情况下执行此操作?
答案 0 :(得分:2)
正如我在Firebird支持邮件列表上发布的那样(好奇地,海报有不同的名称,但同样的问题):
对我来说,除了使用NONE的数据库之外,您还可以连接字符集NONE。要解决这个问题,明确指定lc_ctype = win1257就足够了。
我不太了解Delphi,但假设Delphi内部使用unicode,那么它应该可以工作。