• 締切済み

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)と理解しています。 私の理解は上記のようなものですが、これが正しいのか正直まったく自身がありません。むしろ、違っているならばよりわかりやすい説明をお願いしたいところです。 長文となりましたが、よければ教えてください。お願いします。

  • Perl
  • 回答数2
  • ありがとう数5

みんなの回答

  • 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

  • UNICODEなPerl

    なんかいつもしょうもない質問ばっかで申し訳ないのですが、UNICODEで書いたソースコードを実行してくれるPerlってないですか? できればWINで。 文字列をUNICODEに変換できるモジュールとかじゃなくて、たとえばリテラル文字列のなかにユニコード依存なハートマークとか入れられたり、glob関数がファイルリストをUNICODEで受け取れたりと。

  • [perl5.8] utf8で文字出力すると文字化けする

    perl5.8で、テキストをunicode(utf8)で出力したのですが、文字化けします。 ソースは以下のとおりです。 -----ソース----- use open OUT => ":encoding(utf8)"; open(OUT, ">utf8.txt"); print OUT "utf8だよ\n"; close(OUT); ----------------- できたファイルはutf8エンコードなのですが、 エディタで見ると「だよ」が文字化けします。 ちなみにフリーソフトで、SJIS形式の「utf8だよ」が 書かれたファイルをutf8に変換すると、文字化けしません。 フリーソフトで生成したutf8ファイルと、 自作perlで生成したutf8ファイルとを バイナリエディタで読込み比較すると 75746638E381A0E382880D0A (フリーソフト) 75746638C282C2BEC282C3A60D0A (自作perl) という差が出ています。 原因がお分かりになる方、知恵をお貸し願えますか。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • Perl5.8について詳しく書かれている書籍

    最近Perl5.8にし、文字コードをUTF8をベースに使うようになりました。 以前は、5.6を使っていたので、文字コードについては、あまり意識せず、 出力時のみ気を使っていました。Perl5.8からPerlIOというものがあり、 いまいち理解しづらいのですが、PerlIOについて詳しく書かれている書籍(5.8以上に特化) を探しているのですが、お薦めがございました ら是非お教えください。 最悪、洋書でも構いません。 IO::Fileを使って、入力文字コードは euc-jpで、出力文字コードはシフトJISにする 設定方法がしりたいです。

    • ベストアンサー
    • Perl
  • 文字コードEUCのPerlプログラムが文字化けしてしまいます

    Perlで書かれたCGIを実行しようとしているのですが、プログラムはEUCで記述されているそうです。nkf -g ***とするとEUC-JPとなります。 print " <META http-equiv=\"Content-Type\" content=\"text/html; charset=EUC-JP\">\n"; とも記述されているのですが、ブラウザで実行(閲覧)すると文字化けして、ブラウザのエンコードは、Unicode(UTF-8)になっています。 ちなみに、OSはCentOS5.2です。 どうやったら、EUCで記述されたCGIが文字化けせずに実行できるのでしょうか? teratermでサーバに接続語、viコマンドで表示しても文字化けしています。ファイルの文字コードをEUCからUTF-8にして(nkf -w ***)、ブラウザでアクセスしても文字化けしてしまいます。

    • ベストアンサー
    • Perl
  • Perlの文字コードを意識したファイルの読み込み方

    perl5.8でファイルを読み込む場合、文字コードを意識した以下のような呼び方("<:euc-jp")があるのですが この方法で読み込んだ$datの中身はperlの内部コード(UTF8)になっているということでしょうか? それとも、普通に("<")で読み込んで$dat = Encode::decode("euc-jp", $dat);とすべきでしょうか? use utf8; use Encode; my $fname = "test.txt"; # 文字コードがEUC-JP my $dat = ""; open(IN, "<:euc-jp", "$fname) or die "open error!"; flock(IN, 2); while(<IN>){ $dat .= $_; } close(IN);

    • ベストアンサー
    • Perl
  • auのコンテンツ作成にて文字化け

    現在、perlでbbsを作っています。 携帯に対応させるため3キャリアそれぞれのhtml(同一ファイル内)が存在します。 ドコモやソフトバンクはとりあえず文字化けしないでとりあえず表示してくれます。 ただauだけは文字化けをします。 原因としてはperlで書いたスクリプトファイルをeucで書いているのが理由だと思います。 各キャリアともsjisを標準としているみたいなのですが、この場合どうしたらいいのでしょうか? ドコモ、ソフトバンクについてとりあえずeuc-jpと文字コードの指定をしていますが、ちょっと前の機種ではどうなのか確認できていません。 (たぶんeucには対応していないらしい) au.plをsjisで書いて sub html {} で読み込んでみてもだめでした。 検索しても有力な解決策がみつかりませんでした。 どうかよろしくお願いします。

    • ベストアンサー
    • Perl
  • 入力補完してくれるエディタ

    入力補完してくれる タブ式(マルチドキュメントでもいい 文字コードが最低SJISとEUCとUnicodeに対応してる (強調表示設定とかできればうれしい (軽ければなおいい こんな感じのエディタってありますか? フリーでお願いします

  • Unicode文字の簡単な例が欲しいです

    ※Unicodeとかutf16とか厳密な意味での表記はよく分からないので  "Windwosで使用していて、SJISとSJIS以外を判別したい"とでも  解釈して戴ければと… SJIS以外を判別して制御する簡単なスクリプトを作りたいです。 動作テスト用に(SJISに対応文字が無い)Unicode文字の簡単な 文字が欲しいのですが何か適当なのは無いでしょうか? ・入力しやすい ・目視でSJIS以外とわかりやすい こんな感じが希望なのですが… あとできれば"~"のように、SJISとUnicodeで、別の似た文字に 対応されている為に問題を起こしやすい文字の例も教えて戴けると ありがたいです。 よろしくお願いします。

  • perlでブラウザを作る

    perlを使って、中身が見れる程度のブラウザを作っているのですが表示させると文字化けしてしまいます。 コードはget()でアドレスを指定し、bodyの中身を正規表現でくりぬいてくるという単純なものです。 エンコードの影響だとおもうのですが jcode::convert(\$body, 'euc'); などを入れてみても文字化けは解決しませんでした。 改行が悪さをしてるのかと思い =~ s/[\r\n]//g; も入れているのですがだめです、、、 どうしたら文字化けが解消するのでしょうか?

  • 文字コードの変換について

    現在、表示はPHPで文字コードはEUCで表示しています。 そのときには表示できるのですが、 表示したものを、SHIFT-JISにエンコードしてエクセルに表示するときに、文字コードの違いにより表示されないものがあります。 エンコードは $str = mb_convert_encoding($str, "SJIS", "auto"); と行っています。 EUCからSJISに変換するときに、何か特別なことを行う必要があるのでしょうか??

    • ベストアンサー
    • PHP

専門家に質問してみよう