2017-02-10 104 views
1

我的Delphi(XE 10)程序使用nonunicode(单字节)遗留火鸟数据库(字符集NONE),因此它的数据(即从中读取或保存到数据库)取决于Windows区域为nonunicode程序。根据此Windows设置,相同的数据库字符可以在程序中显示为\ u0101(正确)或\ u0432(即不正确)。 IBX用作数据库访问技术。SetThreadLocale整个Delphi应用程序

我的程序只适用中的指定地方进行nonunicode方案,这是客户端可以接受的。问题是 - 无论Windows设置如何,我都可以让程序感受特定的预定义语言环境?

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

由于意见我意识到的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-Emulator区域设置仿真器是解决问题的唯一工具,但为什么德尔福不允许这样做没有外部工具?

+1

这个答案http://stackoverflow.com/a/2947349/368364可能会给你一个更大的图片。 – RBA

+1

这可能也与此有关http://superuser.com/questions/167950/changing-windows-locales-on-a-per-process-basis – JensG

+0

有作为XE10 –

回答

2

正如我也贴火鸟支持邮件列表(好奇的海报也有不同的名称,但同样的问题):

这听起来好像除了使用NONE数据库后,您还需连接与字符集NONE。为了解决这个问题,明确指定lc_ctype = win1257就足够了。

我不知道德尔福不够好,但假设德尔福内部使用Unicode,那么它应该工作。

+0

没有这样的事情,这并没有帮助! – TomR

+0

Delphi 10 Seattle忽略此lc_ctype,如果lc_ctype指定不存在的字符集(或小写格式),则它只报告不正确的值。否则它不起作用。很难相信,但它发生在德尔福。 – TomR

+0

@TomR也许你应该考虑将你的数据库改为显式WIN1257(或者UTF8),然后用UTF8连接。 –