Encode についての備忘録
全然だめっぽいです。明日の作業のための、メモになってしまいました...
ちうか、わかりづらくね?
○ use encoding について
use encoding プラグマを用いることで、標準入出力の文字コードが指定できる
use encoding 'utf-8', STDIN => 'shiftjis';# STDIN を sjiftjis に、STDOUT を utf-8に指定
use encoding 'utf-8', STDIN => 'shiftjis', STDOUT=>'shiftjis';# STDIN/STDOUT を sjiftjis に指定
use encoding を用いない場合には、エンコードの指定はされない。
※ use encoding 'shiftjis'; # 間違い
○ 文字列の扱いについて
定数文字列は、内部表現として扱われる。(すなわち、UTF-8)
スクリプトは、(恐らく)utf-8で書くことが推奨されていると思う。(よく知らない)
ある変数に入っているデータが、内部表現の文字列として扱われている場合には、Encode::is_utf8()をもちいて判断することが出来る。
use encoding 'utf-8';
if( Encode::is_utf8( $data ) ){
print "内部表現文字列\n";
}else{
print "なんかのデータ\n";
}
○ binmode を用いた文字コードの指定
use encodin 以外にも、binmode() を利用することで、入出力時の文字コードを指定することが出来る。
例えばファイルを開くとき、以下のように文字コードを指定できる。
open( OUT, ">test.txt" );
binmode( OUT, ":encoding(shiftjis)" );
print "ほげほげ";
close( OUT );
ここで、定数文字列"ほげほげ"は、内部表現(utf-8)で表されているが、ファイルハンドラの文字コードがshiftjisのため、(プログラマが)特別な文字コード変換を行わなくとも、適切な文字コードに変換して出力が行われる。
○ ファイルオープン時の文字コード指定
3引数のファイルオープンを用いることで、直接読み込みモードの指定が行える
open( IN, ">:bytes", "hoge.txt" ); # バイナリデータとしてオープン
open( IN, ">:encode(shiftjis)", "hoge.txt" ); # shiftjisとしてオープン
※ デフォルト?
○ Encode::decode() を利用した、内部表現への変換について
Encode::decode() を用いることで、バイト列を内部表現文字列に変換することが出来る。
たとえば、次のようにファイルの内容を読み込んだ場合には、バイナリとしてデータを読み込むので、そのままでは内部表現文字列としては扱われない。
open( IN, "
...と、ここまで書いて、STDIN/STDOUTにbinmodeで文字コードを指定する方法が良くわからなくなってはまる。
よって、書きかけの記事
参考ページ
http://www.lr.pi.titech.ac.jp/%7Eabekawa/perl/perl_unicode.html
http://www.hikoboshi.org/perl/doc/encode.html