• ベストアンサー

$obj->decode($bytes)って何?

Encode.pmのPODを読んでいます。その一文です。 [$obj =] find_encoding(ENCODING)  Returns the encoding object corresponding to ENCODING. Returns undef if no matching ENCODING is find.  This object is what actually does the actual (en|de)coding.  $utf8 = decode($name, $bytes);  is in fact   $utf8 = do{    $obj = find_encoding($name);    croak qq(encoding "$name" not found) unless ref $obj;    $obj->decode($bytes)   };  with more error checking. まず  This object is what actually does the actual (en|de)codeing. 直訳すると、「このオブジェクトは実際のエンコードやデコードを実際に行うものです。」となります。実際の、実際の、と二つ並ぶのはあまり語感が良くないと思いますが、でもこのPODを書いたのは文学者ではないですから、原文の方に問題があるのではないかと思います。 次に「このオブジェクト」とは何を指しているのでしょう。find_encoding関数のことを言っているのでしょうか? というのは、下に  $utf8 = decode($name, $bytes); は実際には、  $utf8 = do{   $obj = find_encoding($name);   croak qq(encoding "$name" not found) unless ref $obj;   $obj->decode($bytes) }; だと書いています。{}の中で一番重要なのはfind_encoding関数だと言いたいのではないかと・・・ そうすると  This object is what actually does the actual (en|de)codeing. は、  「実際にエンコードやデコードを行っているのはこの関数です。」 と訳するのが正しいでしょうか? 最後に、  $obj->decode($bytes) $objという文字コードで記述されている$bytesという文字列をutf-8に変換したもの、という意味なはず。 でも浅学な私には、どのような文法でこのコードが書かれているか分かりません。 Perlにおいて、変数と言えば$objだったり@objだったり%objだったりします。そしてそのリファレンスはこれら変数の前に「\」を付ければ良くて、リファレンスはスカラー変数となるから、 $refobj=\($|@|%)obj; となります。 元の変数が(@|%)objの場合、元の変数の一要素を取り出すには、 $obj([index]|{'index'})=$refobj->index; となります。 これが私の知っている矢印記法の唯一の使い方です。 お手数ですが、どなたか教えていただけないでしょうか?

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

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

This object is what actually does the actual (en|de)coding. のobjectは、その前の文の Returns the encoding object corresponding to ENCODING. Returns undef if no matching ENCODING is find. にある find_encoding(ENCODING) が返す encoding オブジェクトのことです。 > 最後に、 > $obj->decode($bytes) > >$objという文字コードで記述されている$bytesという文字列をutf-8に変換したもの、という意味なはず。 ちがいます。 この$obj は $obj = find_encoding($name); で作られた encoding object です。 $objというオブジェクトの decode メソッドを$bytes という引数を 渡して呼び出しています。その結果が $utf8に代入されています。

makoji
質問者

お礼

なるほど。オブジェクトというものがまるで分かっていないからこういう語訳になるのですね。 ありがとうございました。

その他の回答 (2)

  • zxcv0000
  • ベストアンサー率56% (111/196)
回答No.3

すでに良い回答が付いているので、ひとつだけ。 > $obj->decode($bytes) > $objという文字コードで記述されている$bytesという文字列をutf-8に変換したもの、という意味なはず。 Perlの内部形式が UTF-8 であるからにはそうとも言えますが、違う理解をした方が良いですよ。 $obj->decode($bytes) は、「$objという文字コードで記述されている$bytesという文字列を内部形式にインポートする」ものと理解してください。 実際、$bytesという文字列が元々 UTF-8 であっても、decode() してはじめて内部形式として使用できます。 そのあたりの理解が進むまでは、「内部形式は、既知のどの文字コードとも異なる」と思っていた方が、うまくいくケースが多いと思います。 私が言う内部形式というのはマニュアルでは「UTF-8フラグが付いた文字列」とか言う表現になりますが、私はこのネーミングは入門者に優しくないと思っています。

makoji
質問者

お礼

まだUTF8フラグとかが良く分かっていません。UTF8フラグがあるんだったらShift-JISフラグとかありそうですけど、これまで耳に挟んだことがないのは何故なのか・・・ この当りはまだ勉強を始めたばかりなので、もう少し文献を読みすすめてみます。 ありがとうございました。

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.2

一番最初の > Returns the encoding object corresponding to ENCODING. Returns undef if no matching ENCODING is find. この文の意味をちゃんと読み取ってください。 > (find_encoding 関数は) ENCODING に対応する「エンコーディングオブジェクト」を返します。対応する ENCODING が見つからない場合には undef を返します。 という文の続きで、The object…という文があるわけで、 > 次に「このオブジェクト」とは何を指しているのでしょう。 object とは、find_encoding関数が返す値のことです。 > $obj->decode($bytes) これは、オブジェクト $obj のクラスに属する関数 decode の呼び出しです。 引数 $bytes は、この decode 関数によって変換され、この関数の戻り値が、変数 $utf8 に代入されます。 Perl では、オブジェクト指向の実現方法としてリファレンスを使用しています。 まずはPerlにおけるオブジェクト指向について勉強するのが先だと思います。

makoji
質問者

お礼

この数日でPerlのオブジェクト指向について書いた本を読みこなしてみました。 分かった・・・というか、まだ分かっていないけど、知った後では、最初の訳は赤面物ですね。 ありがとうございました。

関連するQ&A

  • デコードフォームについて。

    以下のスクリプトについて質問があります。かなり多いのですが・・・ sub DecodeForm #返り値:Name=>Val のハッシュ(グロブ) #使用例:*form = EncodeForm(); print $form{name}; { my($encoding) = @_; my($method) = $ENV{'REQUEST_METHOD'}; local($query, @in, $key, $val); require 'jcode.pl' if $encoding; if ($method eq 'GET') { $query = $ENV{'QUERY_STRING'}; } elsif ($method eq 'POST') { read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); } local(@query) = split(/&/, $query); foreach (@query) { tr/+/ /; ($key, $val) = split(/=/); # %HH形式を元の文字にデコードする。 $key =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c", hex($1))/ge; $val =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("c", hex($1))/ge; $val =~ s/\r\n/\n/g; jcode'convert(*key, $encoding) if ($encoding); jcode'convert(*val, $encoding) if ($encoding); $in{$key} = $val; } return *in; } 多いので先頭から順に箇条書きにさせて頂きます。 ・Name=>Val の意味。(#以下がメモであることは分かっています) ・グロブとは何か ・*form = EncodeForm(); print $form{name}; の意味。(特に、先頭の*が分かりません) ・my $encoding という変数も見たことがあるのですが、my($encoding) と my $encoding はどう違うのか。 ・クエリとは何か ・jcode.pl とは、インストールしたPerlに標準でついているライブラリなのか?そうでないのならjcode.plとは何か? ・%HH形式とは何か ・\rの意味 ・jcode'convert の意味 ・*key の * の意味 ・*in の * の意味 多くて申し訳ないです。分かる方いらっしゃいましたご教授くださると幸いです。よろしくお願いします。

    • ベストアンサー
    • Perl
  • Perlの文字コード変換についての質問です。

    Perlの文字コード変換についての質問です。 ホームページ全体は、UTF-8で作成されています。 そのため、$qsは、どうも、S-JISのようなので、UTF-8に変換して URLデコードさせたいのですがうまくいきません。 文字化けしないで、UTF-8で作成されたページに表示させたいのですがどうすればよいでしょうか? 宜しくお願い致します。 ------------------------------------ $qs = $ENV{'QUERY_STRING'}; use Encode::Guess qw/ shiftjis /; use Encode qw/ decode /; $enc = guess_encoding ( $qs ); if ( ref $enc ) { $utf8 = decode ( $enc->name , $qs ); } $qs =~ tr/+/ /; $qs =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg; print "$qs";

    • ベストアンサー
    • Perl
  • Stringの値で型キャストしたい(Java)

    最近OKWaveでお世話になっています。 表現がおかしいかもしれませんが、Stringの変数の値を使って、型キャストしたいです。 様々なオブジェクトが入る配列(Vector)を使用しているため、VectorをObject型にして使用しています。 配列のある要素をget()したのち、getClass().getSimpleName()でクラス名を取得し、そのクラス名を、 Object obj = array.get(i); String name = obj.getClass().getSimpleName(); if(name.equal("Integer")) {  method((Integer)obj);   ・   ・   ・ のような形で、場合分けして、メソッドを呼び出しています。 ですが、この方法だと、条件分岐が増えて、見づらいです。 そこで、クラス名を取得したnameをうまく使ってobjを型キャストしたいです。 これを解決させる方法もしくはヒントを教えてください!

    • ベストアンサー
    • Java
  • フォーム入力

    お世話になります。 現在PHPをUTF-8で作成しております。 UTF-8で作成したPHP(HTML)のフォームより日本語を入力してsubmitしたとき、入力値を何も加工せずに$_POST['inputのname']で表示するときちんと文字化けせずにUTF-8で表示されているようです。 この場合、mb_encoding の関数を使用する必要はありませんよね?? また、 入力値をhtmlentities($入力値,ENT_QUOTES,'UTF-8')としてみて、このままだと日本語が入力された場合表示する文字列は文字化けしてしまうので、表示する前にhtml_entity_decode($入力値)でデコードしています。 この場合だとhtmlentitiesは特に使用する必要はないのでしょうか? エンコード→なんらかの処理→デコードとしているのですが、なんとなく必要ない気もしてきてしまいました。 文字コードについては自分なりに勉強したつもりですが、PHP内部でどのような処理が行われるかなどはよく理解できていないので、どうかご教授ください。 よろしくお願いいたしす。

    • ベストアンサー
    • PHP
  • {ブロック}の外でのみ use utf8; したいのだが・・・

    連投申し訳ありません。 「まるごとPerl」(2006年9月、インプレス刊)という本の「まるごとEncode」という記事に従ってEncodeの勉強をしています。 原記事は UNIX(というか端末コードをUTF-8に出来る環境)ですが、それをWindowsに移植しようとして苦労しています。 #! perl # list3 -- UTF-8モードとバイトモードの切り替え #      インデントを表現するために全角空白を使っています use strict; use warnings; binmode STDOUT, ':encoding(cp932)'; # 追加 # ブロックの外側ではUTF-8文字単位で解釈される use utf8; {  # ブロックの外側ではバイトモードが強制される  use bytes;  my $text = '漢字、カタカナ、ひらがなの混じったtext';  print Encode::decode('UTF-8', substr($text, 9, 12)); # カタカナと表示されたい } my $text = '漢字、カタカナ、ひらがなの混じったtext'; print substr($text, 3, 4); # カタカナと表示されたい __END__ というプログラムを実行すると C:\>list3.pl カタカナカタカナ と表示されてほしいのですが、 C:\>list3.pl Cannot decode string with wide characters at C:/strawberry/perl/lib/Encode.pm li ne 174. と表示されます。 use utf8 を後ろにズラして #! perl # list3 -- UTF-8モードとバイトモードの切り替え #      インデントを表現するために全角空白を使っています use strict; use warnings; binmode STDOUT, ':encoding(cp932)'; # 追加 {  # ブロックの外側ではバイトモードが強制される  use bytes;  my $text = '漢字、カタカナ、ひらがなの混じったtext';  print Encode::decode('UTF-8', substr($text, 9, 12)); # カタカナと表示されたい } # ブロックの外側ではUTF-8文字単位で解釈される use utf8; # 移動 my $text = '漢字、カタカナ、ひらがなの混じったtext'; print substr($text, 3, 4); # カタカナと表示されたい __END__ とするとうまく動いて C:\>list3.pl カタカナカタカナ と表示されます。 #! perl # list3 -- UTF-8モードとバイトモードの切り替え #      インデントを表現するために全角空白を使っています use strict; use warnings; binmode STDOUT, ':encoding(cp932)'; # 追加 # ブロックの外側ではUTF-8文字単位で解釈される use utf8; my $text = '漢字、カタカナ、ひらがなの混じったtext'; # 移動 print substr($text, 3, 4); # カタカナと表示されたい # 移動 {  # ブロックの外側ではバイトモードが強制される  use bytes;  my $text = '漢字、カタカナ、ひらがなの混じったtext';  print Encode::decode('UTF-8', substr($text, 9, 12)); # カタカナと表示されたい } __END__ のようにするとやはり最初と同じエラーになりますが、 #! perl # list3 -- UTF-8モードとバイトモードの切り替え #      インデントを表現するために全角空白を使っています use strict; use warnings; binmode STDOUT, ':encoding(cp932)'; # 追加 # ブロックの外側ではUTF-8文字単位で解釈される use utf8; my $text = '漢字、カタカナ、ひらがなの混じったtext'; # 移動 print substr($text, 3, 4); # カタカナと表示されたい # 移動 no utf8; # 追加 {  # ブロックの外側ではバイトモードが強制される  use bytes;  my $text = '漢字、カタカナ、ひらがなの混じったtext';  print Encode::decode('UTF-8', substr($text, 9, 12)); # カタカナと表示されたい } __END__ だと大丈夫です。 結果として、ブロックの外で use utf8;、中では use bytes; という記事の著者の意図通りに動作しないようで、ブロックの中まで use utf8; が効いているようです・・・。 これは Perl の実装が変わったのでしょうか。 使用しているのは Windows XP Home SP3+Strawberry Perl v5.10.0 です。

    • ベストアンサー
    • Perl
  • Perl 文字コードについて

    From: $from To: $mailto CC: $mailcc Subject: $subject Mime-Version: 1.0 Content-type: text/plain;charset=\"UTF-8\" Content-Transfer-Encoding: 8bit この時点で、UTF-8を指定しました。 use Encode; use Encode::Guess; Encode::Guess->set_suspects( qw/ euc-jp shiftjis 7bit-jis / ); $name = encode('UTF-8', decode('Guess', $name)); で本文を、UTF-8に変換して送るようなコードを書きました。 これで一応、パソコン、スマホ共に「本文」は文字化けせず送れるのですが、 今度、別の問題が発生してしまったようで、 「件名」が文字化けしてしまうようになりました。 $subject = encode('UTF-8', decode('cp932', $subject)); 件名も、本文と同じように変換コードをしてみたところ、パソコンでは文字化けしませんでしたが「件名」で文字化けしてしまいます。 調べたところ本文と件名では、内容が違い MIMEエンコードを使用するとのことだったのですが、 実際どのように使うのかわからないです。 $subject = encode('ISO-2022-JP', decode('cp932', $subject)); encode('MIME-Header-ISO_2022_JP', $subject) このように記述するとスマホでは文字化けしないのですが パソコンで文字化けしてしまいます。 そこで、件名がパソコンとスマホで文字化けしないようにし、本文はUTF-8で送るようにするにはどのようにすればいいのでしょうか?

    • ベストアンサー
    • Perl
  • does not map to shiftjis は解決不可能でしょうか?

    日本語処理、ActivePerlでは無理なのでしょうか? 下記test.plを実行すると、 ======================================================== "\x{00e3}" does not map to shiftjis at test.pl line 10. ... u is \x{00e3}\x{0082}\x ... "\x{0082}" does not map to shiftjis at test.pl line 11. ... s is \x{0082}\x{00e6}\x{0081}[\x{0082}± me is 倉田真由美 ========================================================= となって、倉田真由美しか期待通りに出力されません。 外部ファイルの"よーこ"を正しく扱う方法はないのでしょうか? test.pl (utf-8) -------------------------------------------- use utf8; binmode STDOUT => ":encoding(shiftjis)"; binmode STDERR => ":encoding(shiftjis)"; require 'u.pl'; # utf-8 の外部スクリプト require 's.pl'; # sjisの外部スクリプト $me = "倉田真由美"; print "u is $u\n"; print "s is $s\n"; print "me is $me\n"; ------------------------------------------- u.pl (utf-8) ------------------------------------------- $u = "よーこ"; ------------------------------------------- s.pl (sjis) ------------------------------------------- $s = "よーこ"; ------------------------------------------- ActivePerl 5.8.0.806 Windows2000 (cmd.exe) よろしくお願い申し上げます。

    • ベストアンサー
    • Perl
  • utf8使用時のフォーム入力文字コード

    use utf8; binmode(STDIN,":encoding(shiftjis)"); をすると、入力時に内部変換がかかり、UTF-8として扱える という認識で使っていたのですが、下記のコードを実行してみると 入力した文字は普通に sjisで表示されます。 binmode(STDIN~ はどのような意味を持つのでしょうか。 http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html http://www.hikoboshi.org/perl/doc/encode.html 他、いろいろなサイトで調べてみたのですが、いまひとつ 納得する回答を得ることができません。 //////////////////////////////////////////////////// use utf8; use open 'encoding(utf8)'; binmode(STDIN,":encoding(shiftjis)"); use CGI; print "content-type:text/html; charset=Shift_JIS \n\n"; print <<"EOM"; <form action="xxx.cgi"> <input type="text" name="hoe"> <input type="submit"> </form> ここは UTF-8文字列なので化ける<br> EOM $cgi = CGI->new; print $cgi->param('hoe'); //////////////////////////////////////////////////// 現在は下記のコードで自前で UTF-8に変換しています //////////////////////////////////////////////////// foreach( $cgi->param() ){ my $str = $cgi->param($_); $str = Encode::encode('utf-8', Encode::decode('shiftjis', $str)); $cgi->param( -name=>$_, -value=>$str ); }

    • ベストアンサー
    • Perl
  • Operaのsearch.iniにgoogle翻訳を追加したいのですが

    Operaのsearch.iniにgoogle翻訳を追加したいのですが、アドレス&クエリを分かるかた教えて下さい。 検索の作成でやってみたのですが、動きませんでした。 [Search Engine 17] Name=Google 翻訳 URL=http://translate.google.co.jp/ Query=js=y&prev=_t&hl=ja&ie=UTF-8&layout=1&eotf=1&text=%s&file=&sl=ja&tl=en Key=q Encoding=shift_jis Verbtext=17063 Is post=0 Has endseparator=0 Search Type=0 Position=-1 Nameid=0

  • Opera10のサーチエンジンにMapionを追加したい。

    下記コードで検索しても、地図が表示されません。 どこが間違っているんでしょうか。 [Search Engine 13] Name=Mapion 地図 URL=http://www.mapion.co.jp/front/Front?uc=1&vp=2&grp=al&find=%s Query= Key=m Is post= Has endseparator= Encoding=EUC-JP

専門家に質問してみよう