• ベストアンサー

urlエンコード後の文字コードは何?

$str = "%E3%82%84%E3%81%BE+%E3%81%8B%E3%82%8F"; $str =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C", hex($1))/eg; こうやってurlエンコードすると、以下のようになります。 「やま+かわ」 1.この「やま+かわ」というのは文字コードは何なんでしょうか? 2.Jcode.pmなどのライブラリを使わずに、utf-8で統一したCGIを書きたいのですが、この文字列をどうすればいいでしょうか。コツを教えてください。 3.あと、+を半角スペースに置換する以外に なにか特別なルールはありますか? 4.参考になるWebページがあれば教えてください。

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

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

  • ベストアンサー
  • wildmole
  • ベストアンサー率62% (5/8)
回答No.2

デコードして得られる文字列の文字コードは、エンコード前の文字列の文字コードです。 入力データがSJISならSJIS、EUC-JPならEUC-JPです。 従って、他に入力データの文字コードを指定するヒントがないのなら、Jcodeなどで行っているように、文字データから文字コードを「推定」する必要があります。 Jcode.pmを使いたくない理由が不明ですが、Jcodeを使わないのであれば、当然ながら文字コードの自動判定、UTF-8への変換ロジックを自力で実装する必要があります。 外部プログラムを使用してよいならnkfなどを呼び出すのもよいでしょう。

Scholes_B
質問者

お礼

ありがとうございます。 たいへんに納得です。

その他の回答 (1)

回答No.1

 うろ覚えな回答で申し訳ございません。 先ず >urlエンコードすると  と有りますが貴方がやってらっしゃるのは デコードではないでしょうか?  つまり逆に2の答えがデータをエンコードすれば いいという答えになると思います。  unpackという関数がありますのでそれを 使われては如何でしょうか?  下記に参考となるURLを付けておきます。  上下いたしましたが1については基本的に 2バイト文字はsjisでデータは出てくると思います。  但し、何処かで文字コードを指定していると話は 変わりますが…。  

参考URL:
http://www.mikeneko.ne.jp/~lab/perl/numerical_transform/
Scholes_B
質問者

お礼

ありがとうございまーす。

関連するQ&A

  • utf-8の文字列に対してURLエンコードを行なうには?

    最近 perlをutf-8で書き始めたのですが、文字コードではまっています。 cgiの内部から別のcgiへpostで全角文字を送る場合 URLエンコードしてから送ると思うのですが 文字コードがutf-8の時、どのようにURLエンコードしたら 良いのか分からず困っています。どなたかご存知でしょうか? ちなみに文字を受ける方のcgiでは以下の様にURLデコードしています。 $data =~ tr/+/ /; $data =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg; 試用しているperlのバージョンはperl5.8です、よろしくお願いします。

    • ベストアンサー
    • Perl
  • デコード処理部分のプログラムについて

    デコード処理部分のプログラムで分からないトコがあるので教えてください。 $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
  • 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
  • 入力フォームからの半角カナを認識させたい

    入力フォームからの半角カナを全角に変換したいのですが、方法はありますでしょうか。 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
  • 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
  • 文字列は大文字のまま、UTF-8エンコードの英字だけ小文字にしたい

    下記の方法でUTF-8エンコードをしたときに、 コードの英字が大文字になってしまい困っています。 use Encode; $str = "HOGEホゲ" $str =~ s/(\W)/'%' . unpack("H2", $1)/eg; print "$str"; 現状のエンコード後)HOGE%E3%83%9B%E3%82%B2 希望のエンコード後)HOGE%e3%83%9b%e3%82%b2 半角英数字(HOGE)は大文字のままで、 エンコードだけを小文字で書き出す簡単な方法はありますでしょうか。 (小文字でないと受け付けてくれないサイトに飛ばしたいため) 現状は正規表現でAからZまで26行繰り返しています。 $str =~s/\%([A-Z0-9]{1})?A/%$1a/g; ~ $str =~s/\%([A-Z0-9]{1})?Z/%$1z/g; よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 文字をISO Lathin 1 文字コードに変換したい

    $name ="%8B%B3%82%A6%82%C4";  $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; と書くと 「%8B%B3%82%A6%82%C4」が「教えて」 となることはわかったのですが、 逆に「教えて」を「%8B%B3%82%A6%82%C4」にする方法がわかりません。 Javaスクリプトだとescapeというのを使えばできるみたいなのですが、 perlを使ってできる方法があれば教えて下さい。 またそういう機能を持ったライブラリなんかがあるのでしたらそれも教えてもらえるとありがたいです。

    • ベストアンサー
    • Perl
  • フォームデコード

    よく見かける $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) にするとうまくいかない場合があったりするんですか?

    • ベストアンサー
    • CGI
  • 一般的な方法で『URLエンコード』ができません・・・

    よろしくお願いいたします。 テキストボックスに入力(「こんにちは」など)した値をもとに、Yahooで検索させたいのですが、以下の方法でエンコードしました。 sub url_encode($) { my $str = shift; $str =~ s/([^\w ])/'%'.unpack('H2', $1)/eg; $str =~ tr/ /+/; return $str; } そうしたところ、「/」や「:」も別の文字「%2f」「%3a」に変換されてしまい、Yahooのページが開きません。 ちなみにYahooで「こんにちは」と検索すると、URLが以下のようになります。 http://search.yahoo.co.jp/search?p=%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF&ei=UTF-8&fr=top_v2&x=wrt&meta=vc%3D テキストボックスに「こんにちは」と入力すして検索ボタンをクリックすると、上記のように変換させたいのです。 どのようにしてエンコードしたらよろしいのでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 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

専門家に質問してみよう