« Lazarusでの多言語化 | トップページ | Lazarus用のレポートコンポーネントについて »

2018.09.26

Lazarusでの日本語文字コード処理について

Delphiでは文字列の入力の際に文字コードの違いを自動的に吸収(変換)してくれるのですが、Lazarusでは文字列はUTF-8前提での処理を行うため、日本語を扱う際には多少の工夫が必要になってきます。
例えば、Windows上で蓄積されてきたテキストファイルはまだまだShift-JISコードで保存されたのものが多いと思いますが、残念ながら文字コードがUTF-8前提となっているLazarusでこれらのファイルを普通に読み込むと当然のことながら文字化けを起こします。
私も実際に保存された測定データをLazarusで読み込む処理を書いたのですが、ちょっとハマってしまったので整理してみます。
 
ネット上にはShift-JISコードの文字列は、AnsiToUTF8またはSysToUTF8でUTF-8コードに変換するとの情報があるのですが、実際に試してみると現在のLazarusではShift-JISコードをUTF-8コードに変換してくれません。
 
AnsiToUTF8
Ansitoutf8
 
SysToUTF8
Systoutf8
 
そこで更に情報を探したところ2つの方法を見つけました。ひとつめはLazUTF8ユニットにあるWinCPToUTF8、もうひとつはLConvEncodingユニットにあるCP932ToUTF8です。どちらを使用しても正常にShift-JISからUTF-8にコード変換してくれます。
 
WinCPToUTF8
Wincptoutf8
 
CP932ToUTF8
Cp932toutf8
 
更に、https://torum.jp/2018/01/27/lazarus_unicode-loading-saving-utf-16-files/でCharEncStreamユニットの情報を見つけました。
このユニットを使用すると、読み込んだファイルの文字コードを自動的にUTF-8変換してくれます。Shift-JIS, Unicode(UTF-16) Big Endian/Little Endianは文字コードを自動変換してくれますし、もちろんUTF-8/UTF-8Nも読み込めます。残念ながらEUC-JPやJIS78/83コードは認識してくれませんが、現状これらの文字コードにお目にかかることはほとんどないと思いますので、機能としては十分かと思います。

CharEncStream
Charencstream
 
 

unit Encunit;
 
{$mode objfpc}{$H+}
 
interface
 
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
StdCtrls, LConvEncoding, LazUTF8, CharEncStreams;
 
type
 
{ TForm1 }

TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
OpenDialog1: TOpenDialog;
Panel1: TPanel;
ConvertBy: TRadioGroup;
procedure Button1Click(Sender: TObject);
private
 
public
 
end;
 
var
Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
var
line: TStringList;
enc: TCharEncStream;
begin
with OpenDialog1 do
if Execute then
begin
if ConvertBy.ItemIndex = 4 then
begin
// CharEncStreamを使用する
enc := TCharEncStream.Create; // CharEncStreams
try
enc.LoadFromFile(FileName);
Memo1.Lines.Text := enc.UTF8Text;
finally
enc.Free;
end;
end else begin
line := TStringList.Create;
line.LoadFromFile(FileName);
try
case ConvertBy.ItemIndex of
0: Memo1.Lines.Text := AnsiToUTF8(line.Text); // System
1: Memo1.Lines.Text := SysToUTF8(line.Text); // LazUTF8
2: Memo1.Lines.Text := WinCPToUTF8(line.Text); // LazUTF8
3: Memo1.Lines.Text := CP932ToUTF8(line.Text); // LConvEncoding
end;
finally
line.Free;
end;
end;
end;
end;
 
end.


 
 
「lazcode.zip」をダウンロード
 
 


|

« Lazarusでの多言語化 | トップページ | Lazarus用のレポートコンポーネントについて »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: Lazarusでの日本語文字コード処理について:

« Lazarusでの多言語化 | トップページ | Lazarus用のレポートコンポーネントについて »