2017-02-10 4 views
1

My Unicode(シングルバイト)レガシーFirebirdデータベース(文字セットNONE)を使用するため、そのデータ(読み込みまたはデータベースに保存される)は、非ユニコードプログラムこのWindowsの設定によっては、同じデータベース文字が\ u0101(正しい)または\ u0432(正しくない)としてプログラムに表示されます。 IBXはDBアクセス技術として機能します。Delphiアプリケーション全体のSetThreadLocale

私のプログラムは、非ユニコードプログラム用の特定のローカルでのみ動作し、クライアントでも問題ありません。質問は - どのようにプログラムは、Windowsの設定に関係なく、特定の定義済みのロケールを感じるようにすることができますか?

私はこのためにSetThreadLocaleを使うべきだと思います。しかし、どこにこの電話をかけるのですか?メインフォームの初期化セクションでこの関数を呼び出すだけで十分ですか?または、プロジェクトソースファイル(アプリケーションが初期化されている場所)で呼び出すか、各モジュールの初期化セクションで呼び出す必要がありますか?このコードをどこに置くか - - 私はそれを置く必要があります

SetThreadLocale(my_preferred_locale_id); 
SysLocale.DefaultLCID := my_preferred_locale_id; 
GetFormatSettings; 

しかし、主な疑問が残っている:私は、私は今、私はもう少しコードを書く必要があることがわかりGetThreadLocale returns different value than GetUserDefaultLCID? を知らされたコメントのおかげで

複数の場所に。私はWebSnapアプリケーションを持っていて、自動で複雑なトレッド管理ができると思います。コードはどこに行くべきですか?

何も助けなかっ:

  • 追加LC_CTYPE = WIN1257をTIBDatabase.Params
  • にプロジェクトオプション設定SetThreadLocale ...ここでは、そこに、どこでも
  • 設定 - バージョン情報 - 言語 - ロケールIDを

https://github.com/xupefei/Locale-Emulatorロケールエミュレータは、問題を解決する唯一のツールですが、なぜDelphiは外部ツールなしでこれを実行することはできませんか?

+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

私も(妙にあっポスターは別の名前を持っていましたが、同じ問題)Firebirdのサポートメーリングリストに投稿したよう:

それは離れてあなたのデータベースからNONEを使用していないように私に聞こえる、あなたはまた、接続文字セットNONEでこれを解決するには、lc_ctype = win1257を明示的に指定するだけで十分です。

私は十分にデルファイを知っているが、Delphiは内部的にUnicodeを使用して、それが動作するはずと仮定しません。

+0

いいえ、これは助けになりませんでした! – TomR

+0

Delphi 10 Seattleはこのlc_ctypeを無視しますが、lc_ctypeが存在しない文字セット(または小文字のフォーマット)を指定している場合にのみ、不正確な値を報告します。それ以外の場合は動作しません。信じがたいですが、それはDelphiで起こります。 – TomR

+0

@TomRあなたのデータベースを明示的にWIN1257(またはおそらくUTF8)に変更し、代わりにUTF8で接続することを検討してください。 –

関連する問題