为整个Delphi应用程序设置ThreadLocale

为整个Delphi应用程序设置ThreadLocale,delphi,unicode,locale,firebird,non-unicode,Delphi,Unicode,Locale,Firebird,Non Unicode,我的Delphi(XE 10)程序使用非统一代码(单字节)传统Firebird数据库(字符集无),因此其数据(从数据库读取或保存到数据库中)取决于非统一代码程序的windows区域设置。根据此Windows设置,程序中可以显示与\u0101(正确)或\u0432(不正确)相同的数据库字符。IBX作为数据库访问技术 我的程序只适用于特定的本地代码程序,这是客户可以接受的。问题是-如何使程序在不考虑Windows设置的情况下感受特定的预定义区域设置? 我想我应该使用SetThreadLocale来实

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

我的程序只适用于特定的本地代码程序,这是客户可以接受的。问题是-如何使程序在不考虑Windows设置的情况下感受特定的预定义区域设置?

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

由于我被告知的评论 现在我看到我应该再写一点代码:

SetThreadLocale(my_preferred_locale_id); 
SysLocale.DefaultLCID := my_preferred_locale_id; 
GetFormatSettings;
但是主要的问题仍然存在——把代码放在哪里——我应该把它放在多个地方吗。我有WebSnap应用程序,我想它可以在引擎盖下进行自动和复杂的踏板管理。代码应该放在哪里

没有任何帮助:

  • 将lc_ctype=WIN1257添加到TIBDatabase.Params
  • 正在设置SetThreadLocale。。。到处都是
  • 设置项目选项-版本信息-语言-区域设置ID

Locale Emulator是解决此问题的唯一工具,但为什么Delphi不允许在没有外部工具的情况下执行此操作?

正如我在Firebird支持邮件列表上发布的一样(奇怪的是,那里的海报名称不同,但问题相同):

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


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

这个答案可能会让您对它有一个更全面的了解。这可能也与XE10相关。没有XE10这样的东西,这没有帮助!Delphi 10忽略此lc_ctype,只有当lc_ctype指定不存在的字符集(或小写格式)时,它才会报告不正确的值。否则就不行了。很难相信,但是它发生在Delphi。@ ToMr也许你应该考虑改变你的数据库来显式的Win 1257(或者UTF8),而不是用UTF8连接。项目约束不允许这样的改变。当然,我在其他项目中也这样做过,结果值得投资,但遗憾的是,在这种情况下是不允许的。@TomR那么我只能建议您为这个问题添加更多的细节,比如使用的连接配置、一些代码等。也许有实际Delphi经验的人会提出一个实际的解决方案。