2017-02-10 105 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連接。 –