LazarusのUnicode – loading & saving UTF-16 files

Lazarus(というかFree Pascalというか)で、UTF-16のテキストファイルを編集する必要があったのだけど、情報が無くて、苦労したので、メモ。

調べると、Unicodeとは、って話しとLazarusの内部では~という話しばかりで、「いや、単に使いたいだけなの!!」って人向け。UnicodeStringとWidestringとAnsistringとStringとUTF8Stringってもうおなか一杯。ユニコード対応前の情報と、対応後の情報が混在してしまっている。

基本、最新のlazarus(というかFree PascalというかLCL)では、内部でUTF-8ということで。普段は文字コードを意識する必要はないということで「string」でオケ。じゃShift_JISやうんちゃらしたい時は、また別の話し。。。

さて、UTF-16。

http://wiki.lazarus.freepascal.org/UTF8_Tools

のページから、

http://www.theo.ch/lazarus/utf8tools.zip

をダウンロード。

ただし、パッケージが古いためか、エラーになるので、インストールはしない。Zipファイルの中から、

charencstreams.pas

だけをプロジェクトのフォルダに突っ込み、uses節にcharencstreamsを追加。

ユニコードのファイルを開く時は、TCharEncStreamを使う。

var
  el:TCharEncStream; 
begin
  el:=TCharEncStream.Create;
  el.LoadFromFile(filename);
  text:=el.UTF8Text;

省略しまくってますが、こんな感じ。

ANSI, UTF8, UTF16, UTF32
big-endian, little-endian
with/without BOM

を認識してくれる。

 

UTF-16(BOM)でファイルを保存する時は、

procedure TfrmMain.MenuItemSaveTxtClick(Sender: TObject);
var
 us:TCharEncStream;
begin
 us:=TCharEncStream.Create;
 try
   //save as BOMed UTF-16
   us.HasBOM:=true;
   us.HaveType:=true;
   us.ForceType:=true;
   us.UniStreamType:=ufUtf16le;//ufUtf16be;
   us.UTF8Text:=text;
   us.SaveToFile('testUTF16.txt');
 finally
   us.Free;
 end;
end;

 

こんな感じ。たぶん。

素敵&作者に感謝。

 

*UTF-8で保存する場合は、普通のTStringlistのまま、何も考えずに保存すればUTF-8になってるっぽい。

 

 

Leave a Reply