初めまして、水時計と申します。
現在、UTF-8形式で保存されたファイル(仮に「chn.txt」とします)をDelphiで読み込み、ファイル内容を加工してもう一度外部ファイル(仮に「qus.txt」とします)として保存したいと考えています。
「chn.txt」は中国語の単語帳の元データなのですが、以下のプログラムではリッチテキスト(下のプログラムの「FileStock」のこと)に書き込まれた時点で文字化けしてしまいます。何が原因なのか分からなくて困っています。
var
InF : TextFile; // 読み込みファイル
chn_str : WideString; // 中国語のデータを受け取る変数
begin
AssignFile( InF, 'chn.txt' );
Reset( InF );
Readln( InF, chn_str );
FileStock.Lines.Add(chn_str);
end;
ちなみに、「chn.txt」の中には中国語と特殊文字(aやoの上に横棒が乗っている文字)、日本語と半角英数字が混在している状態です。
また、開発環境はWindows XP、Delphi7です。他に「これが分からなければ答えようが無い」という項目があればご質問ください。
もしかしたら、トンチンカンな質問をしているのかもしれませんが、何とぞよろしくお願いします。
ポイント1:
UTF-8形式の文字列は1文字を1〜4バイトで表現するので、1文字2×nバイトのWideString型で受け取ると奇数バイト文字の解釈がおかしくなる?
ポイント2:
Delphi7にはUTF8String型がある。
ポイント3:
TStrings.Addメソッドの引数はString型
実際コーディングして検証してませんが、元ソースで文字化けが起こるのはポイント1が原因のような気がします。
RichEditに読み込まず、TStringListなどに読み込んで加工しましょう。
NT系のRichEditはクセがある?
回答を下さったお二方、本当にありがとうございます。大変参考になりました。無事、解決いたしました。
ちなみにということで、私がどのように書き換えたかもご報告しておきます。「これはまずい」というものがあればご指摘ください。
var
InF : TextFile; // 読み込みファイル
DummyList : TStringList; // 裏で動くリスト
chn_str : UTF8String; // 中国語のデータを受け取る変数
begin
AssignFile( InF, 'chn.txt' );
Reset( InF );
Readln( InF, chn_str );
DummyList := TStringList.Create;
DummyList.Add(chn_str);
DummyList.SaveToFile('qus.txt');
CloseFile( InF )
end;
今回の質問に関係があるところだけ抜き出しているので、抜けているものがあるかもしれませんが、それはご容赦ください。
ツイート | ![]() |