UTF-8の外部ファイルからUTF-8の外部ファイルへ

解決


水時計  2007-02-20 22:29:45  No: 24979

初めまして、水時計と申します。

現在、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です。他に「これが分からなければ答えようが無い」という項目があればご質問ください。

もしかしたら、トンチンカンな質問をしているのかもしれませんが、何とぞよろしくお願いします。


りっきぃ  2007-02-21 00:21:04  No: 24980

ポイント1:
  UTF-8形式の文字列は1文字を1〜4バイトで表現するので、1文字2×nバイトのWideString型で受け取ると奇数バイト文字の解釈がおかしくなる?

ポイント2:
  Delphi7にはUTF8String型がある。

ポイント3:
  TStrings.Addメソッドの引数はString型

実際コーディングして検証してませんが、元ソースで文字化けが起こるのはポイント1が原因のような気がします。


そうね  2007-02-21 00:23:54  No: 24981

RichEditに読み込まず、TStringListなどに読み込んで加工しましょう。
NT系のRichEditはクセがある?


水時計  2007-02-21 03:05:10  No: 24982

回答を下さったお二方、本当にありがとうございます。大変参考になりました。無事、解決いたしました。
ちなみにということで、私がどのように書き換えたかもご報告しておきます。「これはまずい」というものがあればご指摘ください。

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;

今回の質問に関係があるところだけ抜き出しているので、抜けているものがあるかもしれませんが、それはご容赦ください。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加