2011年5月15日日曜日

Perlの文字コード周り


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


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 件のコメント:

コメントを投稿