2017-02-13 4 views
-1

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-1251https://en.wikipedia.org/wiki/Windows-1257パレットがaが両方のパレットにE2の位置と、この位置を有するが異なる持っていますが、知られているUnicode文字なので、マッピングが知られており、それを表現するためにどのように単一の式が存在しない、それが必要であることを示します文字単位で行われます。

+1

は無謀と思われます –

答えて

-1

次の関数は、私が求めた答えです:Unicodeを拒否

function MyConversionFunction(AChar: Char): Char; 
begin 
    case Ord(AChar) of 
    //A_ 
    $045E: Result:=Char($00A2); 
    $0408: Result:=Char($00A3); 
    $00A4: Result:=Char($00A4); 
    $00A6: Result:=Char($00A6); 
    $00A7: Result:=Char($00A7); 
    $0401: Result:=Char($00D8); 
    $00A9: Result:=Char($00A9); 
    $0404: Result:=Char($0156); 
    $00AB: Result:=Char($00AB); 
    $00AC: Result:=Char($00AC); 
    $00AD: Result:=Char($00AD); 
    $00AE: Result:=Char($00AE); 
    $0407: Result:=Char($00C6); 
    //B_ 
    $0406: Result:=Char($00B2); 
    $0456: Result:=Char($00B3); 
    $0491: Result:=Char($00B4); 
    $0451: Result:=Char($00F8); 
    $2116: Result:=Char($00B9); 
    $0454: Result:=Char($0157); 
    $0458: Result:=Char($00BC); 
    $0405: Result:=Char($00BD); 
    $0455: Result:=Char($00BE); 
    $0457: Result:=Char($00E6); 
    //C_ 
    $0410: Result:=Char($0104); 
    $0411: Result:=Char($012E); 
    $0412: Result:=Char($0100); 
    $0413: Result:=Char($0106); 
    $0414: Result:=Char($00C4); 
    $0415: Result:=Char($00C5); 
    $0416: Result:=Char($0118); 
    $0417: Result:=Char($0112); 
    $0418: Result:=Char($010C); 
    $0419: Result:=Char($00C9); 
    $041A: Result:=Char($0179); 
    $041B: Result:=Char($0116); 
    $041C: Result:=Char($0122); 
    $041D: Result:=Char($0136); 
    $041E: Result:=Char($012A); 
    $041F: Result:=Char($013B); 
    //D_ 
    $0420: Result:=Char($0160); 
    $0421: Result:=Char($0143); 
    $0422: Result:=Char($0145); 
    $0423: Result:=Char($00D3); 
    $0424: Result:=Char($014C); 
    $0425: Result:=Char($00D5); 
    $0426: Result:=Char($00D6); 
    $0427: Result:=Char($00D7); 
    $0428: Result:=Char($0172); 
    $0429: Result:=Char($0141); 
    $042A: Result:=Char($015A); 
    $042B: Result:=Char($016A); 
    $042C: Result:=Char($00DC); 
    $042D: Result:=Char($017B); 
    $042E: Result:=Char($017D); 
    $042F: Result:=Char($00DF); 
    //E_ 
    $0430: Result:=Char($0105); 
    $0431: Result:=Char($012F); 
    $0432: Result:=Char($0101); 
    $0433: Result:=Char($0107); 
    $0434: Result:=Char($00E4); 
    $0435: Result:=Char($00E5); 
    $0436: Result:=Char($0119); 
    $0437: Result:=Char($0113); 
    $0438: Result:=Char($010D); 
    $0439: Result:=Char($00E9); 
    $043A: Result:=Char($017A); 
    $043B: Result:=Char($0117); 
    $043C: Result:=Char($0123); 
    $043D: Result:=Char($0137); 
    $043E: Result:=Char($012B); 
    $043F: Result:=Char($013C); 
    //F_ 
    $0440: Result:=Char($0161); 
    $0441: Result:=Char($0144); 
    $0442: Result:=Char($0146); 
    $0443: Result:=Char($00F3); 
    $0444: Result:=Char($014D); 
    $0445: Result:=Char($00F5); 
    $0446: Result:=Char($00F6); 
    $0447: Result:=Char($00F7); 
    $0448: Result:=Char($0173); 
    $0449: Result:=Char($0142); 
    $044A: Result:=Char($015B); 
    $044B: Result:=Char($016B); 
    $044C: Result:=Char($00FC); 
    $044D: Result:=Char($017C); 
    $044E: Result:=Char($017E); 
    $044F: Result:=Char($02D9); 
    else Result:=AChar; 
    end; 
end; 
関連する問題