Encode についての備忘録

全然だめっぽいです。明日の作業のための、メモになってしまいました...

ちうか、わかりづらくね?


○ use encoding について

use encoding プラグマを用いることで、標準入出力の文字コードが指定できる

use encoding 'utf-8'; # STDIN / STDOUT を utf-8 に指定

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としてオープン

open( IN, ">:encode(utf-8)", "hoge.txt" ); # utf-8としてオープン

※ デフォルト?


○ 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