Perlの文字コードがらみに関して。
何となくやってきたのですが、せっかくなら整理したいのでまとめておきます。
なおPerl自体は5.8.1以降を前提にしたいと思います。
Contents
参考資料
基本期にこの本の要約です。
覚えておきたい用語
バイト文字列
外部から入力された文字列のこと。特定の文字コードで記述されている場合はUTF-8バイト文字列、Shift_JISバイト文字列などと呼びます。他にバイナリ表現、おくてっと文字列、バイトストリーム、バイト列などと呼ばれます。
内部文字列
Perlの内部形式に変換された文字列のこと。他にUnicode文字列、内部表象、内部形式などと呼ばれます。
基本3原則
原則1 外部から入力された文字列はデコードして内部文字列に変換する
外部から入力された文字列はデコードして内部文字列に変換する必要があります。内部文字列に変換するにはEncodeモジュールのdecode関数を使用します。下記ソースは標準入力からデータを受け付けています。
※Data::Dumperだと通常は下記のように化けてしまいます。
バイト文字列 → 内部文字列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#!/usr/bin/perl use strict; use warnings; use Encode; use Data::Dumper; my $byte_str = shift; print Dumper $byte_str; my $internal_str = decode('UTF-8', $byte_str); print Dumper $internal_str; #出力結果 #バイト文字列 $VAR1 = '本日は晴天なり'; #内部文字列 $VAR1 = "\x{672c}\x{65e5}\x{306f}\x{6674}\x{5929}\x{306a}\x{308a}"; |
原則2 外部へ出力する文字列はエンコードしてバイト文字列に変換する
外部に出力するときはエンコードしてバイト文字列に変換する必要があります。
バイト文字列 ← 内部文字列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
use strict; use warnings; use Encode; use Data::Dumper; my $byte_str = shift; print Dumper $byte_str; my $internal_str = decode('UTF-8', $byte_str); print Dumper $internal_str; my $byte_str2 = encode('UTF-8',$internal_str); print Dumper $byte_str2; #出力結果 #バイト文字列 $VAR1 = '本日は晴天なり'; #内部文字列 $VAR1 = "\x{672c}\x{65e5}\x{306f}\x{6674}\x{5929}\x{306a}\x{308a}"; #出力用バイト文字列 $var1 ='本日は晴天なり' |
原則3 ソースコードはUTF-8で保存し、utf8プラグマを有効にする
最後の原則ですが、ソースコードに書かれた文字列は原則文字列リテラルと呼ばれます。文字列リテラルの文字コードはソースコードを保存したときの文字コードと同じになり、UTF-8バイト文字列になります。
内部文字列に変換するため下記のような処理を書く必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
use strict; use warnings; use Encode; use Data::Dumper; my $byte_str = "本日は晴天なり"; print Dumper $byte_str; my $internal_str = decode('UTF-8', $byte_str); print Dumper $internal_str; #出力結果 #バイト文字列 $VAR1 = '本日は晴天なり'; #内部文字列 $VAR1 = "\x{672c}\x{65e5}\x{306f}\x{6674}\x{5929}\x{306a}\x{308a}"; |
しかし、上記の記述はやや冗長なため、use utf8と書いてあげると自動的に内部文字列に変換されます。このことをutf8プラグマを有効にする、といいます。
1 2 3 4 5 6 7 8 9 10 11 |
use strict; use warnings; use Encode; use Data::Dumper; use utf8; my $byte_str = "本日は晴天なり"; print Dumper $byte_str; #出力結果 #内部文字列 $VAR1 = "\x{672c}\x{65e5}\x{306f}\x{6674}\x{5929}\x{306a}\x{308a}" |
今回は基本原則なのでここまで。次回以降もう少し掘り下げていきます。
[…] Perlの文字コードに関して その1 […]