• ベストアンサー

GETで日本語を暗号化する

 検索フォームなどで main.cgi?mode=open&word=検索文字列  上のようにURLに文字を入力しても検索できるんですけど、 「検索文字列」の部分を暗号化(?)して日本語表示しないで 日本語が書かれている場合と同じ処理を行いたいのですが、 どうすればいいのでしょうか  ちょうどGOOGLEで検索したときの 「&q=%E3%81%82」この部分です。 よろしくお願いします。

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

  • ベストアンサー
  • SHOO-3
  • ベストアンサー率56% (28/50)
回答No.4

No.3です。なんかいろいろ間違えてますね。 (EncodeモジュールでShift_JISに変換しています) これは間違いです。消し忘れました…orz $str =~ Encode::from_to($str, 'Guess', 'euc-jp'); らへんの $str =~ って部分、無くても動きます。 というか、無いほうが普通かな…OTZ ついでに、もしかしたら逆に、エスケープする方法 (日本語文字→%93%FA%96%7B%8C%EA%95%B6%8E%9A見たいな変換) を訊いていたのかもしれない(見当違いな回答をしていたかもしれない)ので、そっちも答えておきます。 No.2さんのURI::Escapeでやる方法が簡単でいいと思いますが、正規表現で変換すると、 $str =~ s/(\W)/'%' . unpack('H2', $1)/eg; となります。これがもっとも実行速度が速い方法らしいです。実際見てみても、URI::Escapeのものよりも、1.5倍から2倍くらい速いみたいです。 ちなみに、アンエスケープする方法で、URI::Escapeを使った場合、 use URI::Escape; $safe = uri_unescape("%E6%A4%9C%E7%B4%A2%E6%96%87%E5%AD%97%E5%88%97"); とすればアンエスケープしてくれますが、UCS2(UTF-16、最近のIEのJavascriptではこうやって変換してくることも。)はアンエスケープしてくれないかもしれません。

if_else
質問者

お礼

上の方法で無事暗号化することができました。 ありがとうございました。

その他の回答 (3)

  • SHOO-3
  • ベストアンサー率56% (28/50)
回答No.3

URIエスケープ(URLエンコードともいう)というやつですね。 文字コードによってアンエスケープ方法が違います。 Perlの例で説明すると、 Shift-JISやEUC-JPならば、 $str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg; で、いけます。JcodeやEncodeのあいまい変換を使って文字コードを直すといいと思います。 Unicodeの場合は、 $str =~ s/%u([0-9a-fA-F]{4})/pack('H4', $1)/eg; と $str =~ s/%([eE][0-9a-fA-F]{1})%([0-9a-fA-F]{2})%([0-9a-fA-F]{2})/pack('H2', $1) . pack('H2', $2) . pack('H2', $3)/eg; の二通りあって、上がUTF-16、下がUTF-8(EncodeモジュールでShift_JISに変換しています)となります。 ちなみに、だいたいのものを変換したければ、 use Encode qw(from_to); use Encode::Guess qw(euc-jp shiftjis); if($str =~ /%u[0-9a-fA-F]{4}/){ # UCS2(UTF-16)の場合は $str =~ s/%u([0-9a-fA-F]{4})/pack('H4', $1)/eg; $str =~ Encode::from_to($str, 'ucs2', 'euc-jp'); }elsif($str =~ /(?:%[eE][0-9a-fA-F]{1}(?:%[0-9a-fA-F]{2}){2}){2,}/){ $str =~ s/%([eE][0-9a-fA-F]{1})%([0-9a-fA-F]{2})%([0-9a-fA-F]{2})/pack('H2', $1) . pack('H2', $2) . pack('H2', $3)/eg; $str =~ Encode::from_to($str, 'utf8', 'euc-jp'); }else{ $str =~ s/%([0-9a-fA-F]{2})/pack('H2', $1)/eg; $str =~ Encode::from_to($str, 'Guess', 'euc-jp'); } これで大体いけると思います。(euc-jpとShift_JISの判別方法がわからないので、あいまい変換。) 以下は参考です。 http://www.din.or.jp/~ohzaki/perl.htm#JP_Escape http://www2.famille.ne.jp/~akio1998/simaguni.html

  • ezplus
  • ベストアンサー率54% (6/11)
回答No.2

こんなのをご所望なのかどうかはわかりませんが use URI::Escape; $safe = uri_escape(検索文字列); で$safeにはURIエスケープされた文字列が入ります。 例えばSJISの「検索文字列」を与えれば「%8C%9F%8D%F5%95%B6%8E%9A%97%F1」になります。 EUCの「検索文字列」を与えれば「%B8%A1%BA%F7%CA%B8%BB%FA%CE%F3」になります。 見当違いだったら申し訳ないです。

if_else
質問者

お礼

No.3,4の方のを参考にさせていただきます。 ありがとうございました。

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.1
if_else
質問者

お礼

すみません。 ページを見てみましたがわかりませんでした。 ありがとうございました。