• 締切済み

perl 5.6 とperl 5.8 の内部形式の違い

perl 5.8 からはUnicode対応され、内部形式がUnicodeで管理されると聞きました。Unicodeで管理されるということが結局どういうことなのか?従来のperl 5.6 と比べて何が変わったのかが理解できません。 perl 5.6 はUnicode対応されていないので内部形式はバイナリ。たとえばリテラル文字をソースに書いた場合、内部での文字はバイナリ列として管理されるのでバイナリの元の文字がどのようなエンコード(EUC、SJIS等)であったかはプログラマが意識するところ。それに対し、perl 5.8 はUnicode対応されているのでperl 5.6 のようにプログラマが文字コードを意識する必要はない(常にUnicode)と理解しています。 私の理解は上記のようなものですが、これが正しいのか正直まったく自身がありません。むしろ、違っているならばよりわかりやすい説明をお願いしたいところです。 長文となりましたが、よければ教えてください。お願いします。

みんなの回答

  • Werner
  • ベストアンサー率53% (395/735)
回答No.2

内部形式がUTF8なので、プログラマは PerlIOレイヤやuse utf8(またはuse encoding)、decode/encodeなどを利用して 文字列を内部形式に変換する(UTF8フラグを立てる)必要があります。 なので文字コードを意識しなくてすむわけではないです。 ただ、PerlIOレイヤを使えば変換している記述を省くことはできるかもしれない。 Perl 5.8.x Unicode関連 http://www.rwds.net/kuroita/program/Perl_unicode.html perluniintro - Perl Unicode の手引き http://perldoc.jp/docs/perl/5.8.1/perluniintro.pod 内部形式がUTF8になった利点は、 文字列を(バイト単位ではなく)文字単位でちゃんと扱えるようになったことだと思います。 # 余談 openやopendirでファイル名やディレクトリ名を指定するときは (Windows環境では) CP932にデコードしないと文字化けするけど、 このあたりの処理をPerlIOレイヤみたいな仕組みで透過的にできないのかな?

  • g_p_
  • ベストアンサー率53% (28/52)
回答No.1

こんにちは、私の出る幕ではないかもしれませんが… >perl 5.8 はUnicode対応されているのでperl 5.6 のようにプログラマが文字コードを意識する必要はない(常にUnicode)と理解しています。 これは多分違いますよ。 あんまり良い例を思いつきませんが、 utf8で以下のスクリプトを書いて実行すると、 #! active perl use 5.008; use strict; use warnings; use Devel::Peek; use Encode; # windows + ActivePerl なので STDOUT をshiftjis に binmode STDOUT,q{:encoding(shift_jis)}; my $str = '文字'; ### case 1 ### print qq{** case 1 **\n}; print $_ , "\n" for split '' , $str; print Dump $str; ### case 2 ### print qq{\n} x 3 , qq{** case 2 **\n}; $str = decode('utf8',$str); print $_ , "\n" for split '' , $str; print Dump $str; ### case 3 ### { use utf8; my $str = '文字'; print qq{\n} x 3 , qq{** case 3 **\n}; print $_ , "\n" for split '' , $str; print Dump $str; } 以下の様な結果になります。 ** case 1 ** "\x{00e6}" does not map to shiftjis at utf.pl line 13. \x{00e6} "\x{0096}" does not map to shiftjis at utf.pl line 13. \x{0096} "\x{0087}" does not map to shiftjis at utf.pl line 13. \x{0087} "\x{00e5}" does not map to shiftjis at utf.pl line 13. \x{00e5} "\x{00ad}" does not map to shiftjis at utf.pl line 13. \x{00ad} "\x{0097}" does not map to shiftjis at utf.pl line 13. \x{0097} SV = PV(0x278c80) at 0x1832eb4 REFCNT = 1 FLAGS = (PADBUSY,PADMY,POK,pPOK) PV = 0x18e8d1c "\346\226\207\345\255\227"\0 CUR = 6 LEN = 8 ** case 2 ** 文 字 SV = PV(0x278c80) at 0x1832eb4 REFCNT = 1 FLAGS = (PADBUSY,PADMY,POK,pPOK,UTF8) PV = 0x18df554 "\346\226\207\345\255\227"\0 [UTF8 "\x{6587}\x{5b57}"] CUR = 6 LEN = 8 ** case 3 ** 文 字 SV = PV(0x18d3214) at 0x1881d68 REFCNT = 1 FLAGS = (PADBUSY,PADMY,POK,pPOK,UTF8) PV = 0x18e8d1c "\346\226\207\345\255\227"\0 [UTF8 "\x{6587}\x{5b57}"] CUR = 6 LEN = 8 perl5.8で実行していますが、case 1 では、 utf8 の文字列を1バイト毎に分割されて出力されています。 utf8 フラグもついていません。 case 2,3 はちゃんと'文字'を'文'と'字'に分割しています。 普通にファイルを open した時とかも勝手にutf8に変換する訳じゃないですし、 仮にそれが utf8 のファイルだったとしても、内部的にはそう扱ってくれないと思います。 euc や shiftjis でスクリプトを書く場合もあるでしょうし。 ですので、やっぱりプログラマは文字コードを意識しなければならないと思います。

関連するQ&A