My Delphiプログラムは正しい文字を取得しません。 SetThreadLocale for the entire Delphi applicationは私の問題の文脈です。私はFirebird 1.5 charset NONEデータベースを使用しています。このデータベースにはWIN1257のデータが入っています。私はこのデータベースからデータを取得するために、Delphi 10 Seattle IBXコンポーネントを使用しています。通常、私はWindows上で、Unicode以外のプログラム用のバルト語ロケールの1つを使用してプログラムを使用します。しかし、時には私のプログラムをロシアのロケール(WIN1251文字セット)でWindows上で実行する必要があります。Delphi - キャラクタセット間の変換 - 説明とそれを行う方法?
そして、私は次のような問題で立ち往生しています:データベースのvarchar型のフィールドは、プログラムがバルトのロケールで実行されたときに\u0101
としてDelphiコード(fieldname.asString)で検索された文字ā
が、含まれていますが、それはretrieviedされる(fieldname.asString )を\u0432
としてロシア語ロケールで実行すると、ロシア語の場合は\u0101
と表示する必要があります。
すべての接続パラメータをTIBDatabaseに設定しようとしましたが、目標を達成できませんでした。だから今私は翻訳をする考えがあります:私はプログラムがロシア語のロケールの下で実行されていることを検出することができますし、MyConvert(fieldname.asString)
のような特殊な変換関数を適用して\u0432
を\u0101
に変換し、
このような変換機能があり、使用方法はありますか?双射を決定するアルゴリズムは何ですか?\u0432
< - >\u0101
?
ユニコードデータベースへの移行は私の選択ではありません。
現在の質問ではSetThreadLocale for the entire Delphi applicationと同じコアの問題を解決しようとしますが、では別のアプローチとなります。私は自分のアプリケーションにスレッドロケールを設定することはできませんでした。したがって、文字変換を行うことにしました。この質問はどのように行うのですか?
を追加しました:https://en.wikipedia.org/wiki/Windows-1251とhttps://en.wikipedia.org/wiki/Windows-1257パレットがa
が両方のパレットにE2の位置と、この位置を有するが異なる持っていますが、知られているUnicode文字なので、マッピングが知られており、それを表現するためにどのように単一の式が存在しない、それが必要であることを示します文字単位で行われます。
は無謀と思われます –