• ベストアンサー

フォームデコード

よく見かける $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; というやつの pack("C", hex($1)) を chr($1) にした方がいい と思ったんだけど、chr($1) のソースは見たことがないです。 chr($1) にするとうまくいかない場合があったりするんですか?

  • A__
  • お礼率59% (194/328)
  • CGI
  • 回答数2
  • ありがとう数1

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

  • ベストアンサー
  • yuizuian
  • ベストアンサー率42% (103/245)
回答No.1

一般的には $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; を使用しますが、chr関数を使用することもできますよ。 ただchr($1) だと、$1の中身を十進数の数値だと 解釈されてしまいますので、chr(hex($1))とする 必要があります。←$1の中身は16進数です (ご存知かもしれませんが、hex関数は16進数の数値を十進数に変換するものです)

A__
質問者

補足

ごめんなさい。 間違えて書いていました。 pack("C", $xx); は chr($xx); だから、 pack("C", hex($1)) を chr(hex($1)) としてもいいか聞きたかったんです。 でも、そういうお返事もらえてよかったです。 ありがとうございます。 pack() の代りに chr() は使えるんですね。 chr() の方がソースが短くなるし、 chr() の方が単純だから処理時間が早いと思うんだけど pack() で書かれていることが多いから フォームデコードでは chr() より pack() の方が優れているところがあるのかなと思っています。 もし違いがあったら教えてください。

その他の回答 (1)

  • onosuke
  • ベストアンサー率67% (310/456)
回答No.2

昔はchr()がなかったんです。 たしか,Perl5で増えた新しい関数だったはず。 > $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; これは昔からあるような,定番コードですからね。

A__
質問者

お礼

ありがとうございます。 Perl4 では chr( ) が使えないから、 chr( ) のソースはあまりないということだったんですね。

関連するQ&A

  • デコード処理部分のプログラムについて

    デコード処理部分のプログラムで分からないトコがあるので教えてください。 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'euc'); この『pack("C", hex($1))』、『eg』の部分の意味がよく分かりません。 『&jcode'convert(*value,'euc');』の部分も微妙なので、お願いします。

    • ベストアンサー
    • Perl
  • 入力フォームからの半角カナを認識させたい

    入力フォームからの半角カナを全角に変換したいのですが、方法はありますでしょうか。 h2z_sjisを使ってみましたが、うまく行きませんでした。 foreach $pair (@pairs){ ($name, $value) = split(/=/, $pair); $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*name,'sjis'); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'sjis'); &jcode'h2z_sjis(*value); $FORM{$name} = $value; } <結果> アイウエオ(半角) → 渦慨オ よろしくお願いします。

    • ベストアンサー
    • Perl
  • UTF-8から送信されたデータを日本語化するには?

    %E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A これを あいうえお に変換するには、どのようにデコードすればいいのでしょうか? ご教授お願いします。m(_ _)m [現在のソース] $buffer = $ENV{'QUERY_STRING'}; @pairs = split(/&/,$buffer); foreach $pair (@pairs){ ($name, $value) = split(/=/, $pair); $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; my $value = Jcode::convert($value, 'utf8'); $FORM{$name} = $value; } ↓ 「縺ゅ>縺・∴縺・」が検出されます。

    • ベストアンサー
    • Perl
  • URLデコードするソースですが、。。。

    分かる方、ぜひ教えていただきたいです。 CGI掲示板を作っていますが、 参考書に次のソースが載っており、 $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; それの機能は「URLデコード」だそうです。 多分、エンコードでわけのわからなくなった日本語文字(%98%45%83など)を ちゃんと読める文字にしてくれる機能だろうとは理解していますが。。。 上のソースをリファランスなどで調べたところ、 「hex()は16進数を10進数に変換する関数」で、 「pack()はバイナリ体構造体に変換する関数」とかいてありますが、 バイナリ体構造体??何それ???って感じです。バイナリって2進数ですよね? 日本語ってバイナリですか。どうも正確な意味が分かりません。 どなたか分かりやすい解説をお願いいたします。

    • ベストアンサー
    • CGI
  • PerlプログラムをPHPで書き直しています

    Perlで作ったものをPHPで書き直しています。 似てるようで大変ですね。 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; という表現ですが、これをPHPで書き直すとズバリどのように なりますか? ちなみにPERLのソースコードでは、このあと &jcode'convert(*value,'sjis'); になるのですが、PHPでPerlのこの変換を実現する一般的方法が あったら教えてください。その方法で全部書き直そうと思います。

    • ベストアンサー
    • PHP
  • デコードできない時があります><

    なぜか「ひらがな」を偶数個送るとデコードしません 例 「あ」→「あ」 「ああ」→「縺ゅ≠」 「ああい」→「ああい」 「ああいい」→「縺ゅ≠縺・>」 「ああ質問」→「ああ質問」 「ああアあ」→「ああアあ」 今の所漢字やカナを含めて偶数個では問題無いです。 use lib './lib'; use Jcode; read(STDIN, $POST, $ENV{'CONTENT_LENGTH'}); @_post = split (/&/,$POST); foreach $tmp (@_post) { ($name,$value) = split (/=/,$tmp); $value=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; Jcode::convert($value,"sjis"); $box{$name} = $value; } デコード処理はこんな感じです。 JcodeはJcode-2.07を使ってます。 独自で色々調べたのですが解決策が見つからず大変困っております。 宜しくお願いします。

    • 締切済み
    • CGI
  • 半角スペースが有効にならない。

    前のページで入力された値を取得するCGIですが、どうしても半角スペースを認識しません。 それどころか、半角スペースの後ろを一切消してデータを取得しています。 同じように作成したものはきちんと動いているのに…。 どこが間違ってるかご指摘お願いします。 ---------- #!/usr/local/bin/perl read(STDIN,$buffer,$ENV{'content_length'}); @atai = split(/&/,$buffer); foreach $atais(@atai){ ($key, $value) = split(/=/, $atais); $FORM{$key}=$value; } $buffer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $key =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $buffer =~ tr/+/ /; $value =~ tr/+/ /; $key =~ tr/+/ /; print "Content-type:text/html\n\n"; print "$key<BR>\n"; print "<A HREF=./***.cgi>Back</A><BR>\n"; open (FH,">***.log"); @filew="$buffer\n"; print FH @filew; close(FH); exit; ---------- 以上です。よろしくお願いします。

    • ベストアンサー
    • CGI
  • tr///;はカンマを処理できないのですか?

    フォームからのよくあるデコード処理を私は以下のように書いてます。 (中略) foreach $pair(@pairs){ ($key,$value)=split(/=/,$pair); $key=~ tr/+/ /; $key=~ tr/,/_/; $key=~ s/%([\dA-Fa-f][\dA-Fa-f])/pack("C",hex($1))/eg; &jcode'convert(*key,'euc'); $value=~ tr/+/ /; $value=~ tr/,/_/; $value=~ s/%([\dA-Fa-f][\dA-Fa-f])/pack("C",hex($1))/eg; &jcode'convert(*value,'euc'); $input{$key}=$value; } ところが、フォームでカンマを入力するとtr/,/_/で置換えられるはずだとおもうのですが、カンマはカンマのまま渡ってきてるようです。 tr///;はカンマを処理できないのでしょうか? csvで書き出すとき問題があると思うのです。 ご存知の方いらっしゃいましたらよろしくお願い致します。

    • 締切済み
    • CGI
  • デコード処理について

    sub decode { if ($ENV{'REQUEST_METHOD'} eq "POST") { if ($ENV{'CONTENT_LENGTH'} > 51200) { &error("投稿量が大きすぎます"); } read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $in{$name} = $value; } while (($k,$v) = each %in) { $v =~ s/&/&amp;/g; $v =~ s/</&lt;/g; $v =~ s/>/&gt;/g; $v =~ s/"/&quot;/g; $in{$k} = $v; } } 上記の処理が、具体的にどうなっているのかよくわかりません。 どなたか分かる方、説明をお願いします。

  • デゴートについて

    初心者です。お願いいたします。 デゴートについての基礎を学んでいるのですが 行き詰っています。 $value=~s/%([a-fa-F0-9][a-fA-F0-9])/pack('C',hex($1) )/ge; という文なのですが、この解釈の仕方がイマイチ分かりません。 ●s/// = 置き換え演算子 ●『%([a-fa-F0-9][a-fA-F0-9])』を『pack('C',hex($1))』 に変換する ●hex関数 = 16進数に変換する ・・・と自力で少し理解してみたのですが、参考書によると、hex関数で16進数を10進数に変換する・・と逆のことが書いてあるんです(TT) それと最後の『ge』とはどういう意味なのでしょうか。 理解不足で申し訳ないのですが、どなたか詳しい方、アドバイスいただければ助かります。お願いいたします。

    • ベストアンサー
    • CGI

専門家に質問してみよう