2017-09-16 53 views
1

韓国のCP51949(EUC-KR)でエンコードされたANSIファイルを文字列配列(LoadStringsFromFile)にロードしています。私のシステムと意図したエンドユーザシステムでは、CP51949が従来の非Unicodeエンコーディングとして設定されていません。 (セットアップ自体は英語版のみであることから、単なる迷惑です)私はロケールエミュレータでアプリケーションを実行しない限りInno Setup - 文字列の配列をUnicodeに変換してANSIに戻す

  1. 、韓国語のテキストは次のように表示されます。現時点では

    私はこれで2つの問題を抱えていますうんざりする
  2. Posは、Stringに切り替えてからAnsiStringに戻ってから間違った結果となり、StringChangeが完全に失敗します。

だから、保存する前にユニコードに変換して戻す方法があるのだろうかと思います。ユニコードstring(UTF-16 LE)に特定のANSIエンコーディングでエンコードされたファイルを変換する

+0

@ MartinPrikrylもし私がそれを明確にしていなければ、ファイルはANSIであり、正しい文字を見て、すべてをStringとして扱うためにUnicodeとしてコンテンツをロードする必要があります(AnsiString <-> String headacheを取り除きます)ファイルに保存するために戻る –

+0

@MartinPrikryl、まあ、いいえ...実際はCP51949(EUC-KR)です。それはCP949で動作するかもしれませんが、私は試していません。オリジナルの未編集ファイルはCP51949です。 –

答えて

1

MultiByteToWideChar functionを使用する:

function MultiByteToWideChar(
    CodePage: UINT; dwFlags: DWORD; const lpMultiByteStr: AnsiString; 
    cchMultiByte: Integer; lpWideCharStr: string; cchWideChar: Integer): Integer; 
    external '[email protected] stdcall'; 

function LoadStringFromFileInCP(FileName: string; var S: string; CP: Integer): Boolean; 
var 
    Ansi: AnsiString; 
    Len: Integer; 
begin 
    Result := LoadStringFromFile(FileName, Ansi); 
    if Result then 
    begin 
    Len := MultiByteToWideChar(CP, 0, Ansi, Length(Ansi), S, 0); 
    SetLength(S, Len); 
    MultiByteToWideChar(CP, 0, Ansi, Length(Ansi), S, Len); 
    end; 
end; 

function LoadStringsFromFileInCP(
    FileName: string; Strings: TStrings; CP: Integer): Boolean; 
var 
    S: string; 
begin 
    Result := LoadStringFromFileInCP(FileName, S, CP); 
    if Result then Strings.Text := S; 
end; 

(I、文字列/行を格納するTStringsを使用していることに注意してくださいTStringsとして代わりにTArrayOfStringのコレクションは、


)で動作するように簡単ですバックANSIにUnicodeのstringを変換するには、WideCharToMultiByte functionを使用します。

function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; 
    lpWideCharStr: string; cchWideChar: Integer; lpMultiByteStr: AnsiString; 
    cchMultiByte: Integer; lpDefaultCharFake: Integer; 
    lpUsedDefaultCharFake: Integer): Integer; 
    external '[email protected] stdcall'; 

function SaveStringToFileInCP(FileName: string; S: string; CP: Integer): Boolean; 
var 
    Ansi: AnsiString; 
    Len: Integer; 
begin 
    Len := WideCharToMultiByte(CP, 0, S, Length(S), Ansi, 0, 0, 0); 
    SetLength(Ansi, Len); 
    WideCharToMultiByte(CP, 0, S, Length(S), Ansi, Len, 0, 0); 
    Result := SaveStringToFile(FileName, Ansi, False); 
end; 

function SaveStringsToFileInCP(
    FileName: string; Strings: TStrings; CP: Integer): Boolean; 
begin 
    Result := SaveStringToFileInCP(FileName, Strings.Text, CP); 
end; 

は、のような関数を使用します

const 
    CP_EUC_KOREAN = 51949; 

var 
    I: Integer; 
    Strings: TStrings; 
begin 
    Strings := TStringList.Create; 
    if LoadStringsFromFileInCP('korean.txt', Strings, CP_EUC_KOREAN) then 
    begin 
    for I := 0 to Strings.Count - 1 do 
    begin 
     MsgBox(Strings[I], mbInformation, MB_OK); 
    end; 
    end; 

    SaveStringsToFileInCP('korean_out.txt', Strings, CP_EUC_KOREAN); 
end; 

を私の英語のみのシステム上で正しく動作:

enter image description here enter image description here

関連する問題