perl - Encode 入門
perl - Encode 中級
perl - use utf8; #って何だ?
Perl で utf8 化けしたときにどうしたらいいか
use utf8って何よ
- (ASCII領域外の)各文字列にutf-8を示すフラグを付ける。
- ソースコードがutf-8であること前提
- エディタでutf-8で書く必要がある。
基本の流れ
- 入力データの文字コード->utf-8に変換
- utf-8から元の文字コードに戻して出力
# ecu-jpからutf8に、決め打ちで変換
use Encode.pm
my $utf8 = decode("eucjp", $_); //ecujpをutf-8に変換 フラグも付ける。
print encode("eucjp", $utf8);
変換しないと。。。
・正規表現など、検索がマッチしない。
・utf-8とそうでない文字列を結合すると、文字列全体がutf-8扱いになるので、文字化けする。
decodeとencodeの覚え方
perl側から見て、バイト列に符号化(encode)するか、perlの内部表現に復元(decode)するか
入力コードを判定して変換
Encode::Guess
suspects(容疑者)に、変換候補を書いておく(完璧に判定するのは不可能なため?)
use Encode::Guess;
Encode::Guess->set_suspects(qw/euc-jp shiftjis 7bit-jis/);
変換元コード決め打ち&頻繁に変換 => find_encoding
以下の'eucjp'など、名前判定しなくていいので高速。
(encode,decodeは内部でfind_encodingを使用している)
# 変換元コード決め打ち&頻繁に変換
use Encode.pm
my $eucjp = find_encoding('eucjp');
my $utf8 = $eucjp->decode($_);
print $eucjp->encode($utf8);
ファイルを開く際に文字コード指定(変換元コード決め打ち)
#use Encode.pm <- :encodingはPerlIO機能なのでいらない
open my $fh, "<:encoding(eucjp)", $argv or die "$argv : $!";
utf-8 フラグの確認
use Devel::Peek;
Dump($x);
SV~LENまでが一塊。
FLAGSにUTF8があるかどうかで判断。
エラー処理
エンコードに失敗した場合、encode,decodeの第3引数でエラー処理を実施できる。
以下の定数は変換できなかった場合、実体参照にする。
Encode::FB_HTMLCREF #10進数
Encode::FB_XMLCREF #16進数
Encode::FB_PERLQQ #perl表記 \x{ }
サブルーチン(クロージャ)を渡すことも可能
EUC-JPやShift_JISで扱えない文字も、HTMLやXMLではCharacter Reference (文字参照;CREF)という方法で表記することが可能です。例えば、☺は&#9786;または&#x263A ;と表記すればいいのです。前者はその文字のUnicodeを10進数表記、後者は16進表記したものです。
エラーメッセージ
- Wide character in print at ...
- UTF8フラグが付いているのをprintしているので、encode('utf8', $text);
OOP
Encode::Encoder
ルール追加
- 動的: Encode::Encoding
- 静的: enc2xs
ちなみに
\x{3000} は全角空白
0 件のコメント:
コメントを投稿