• ベストアンサー

GETで日本語を暗号化する

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

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

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

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

お礼

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

関連するQ&A

  • フォーム送信とURLエンコードについて

    CGI&PHP初心者です。 フォームのデータ送信とURLエンコードについて、お尋ねします。 method="GET" のフォームで、検索フォームをつくりたいとおもっています。 日本語も含めた検索語をフォーム送信したいと考えていますが、 送信の結果、エンコードされずにそのままブラウザのURL欄に入力した日本語が表示されてしまいます。 (ただ、メモ帳などにURLをコピーペーストするとURLエンコードがされているようです。) googleでは検索結果のアドレス欄にURLエンコードされた文字列がでているが、 同じように検索結果のアドレス欄にはURLエンコードされた文字列をだしたい。 URLに日本語をださずにURLエンコードさせた文字列を表示させるには、 どうすればいいのでしょうか? 補足:できるかぎり検索処理が重くならないにしたいと思います。     開発環境PHP&MySQL     動作環境Chrome のバージョン 38.0

    • ベストアンサー
    • CGI
  • mhtファイルからの日本語部分の抽出

    wordでmhtファイルとして保存した場合、 保存したファイルをエディタで見ると、 日本語の部分が ㍃ 等になっています。 これらは、文字コードなのでしょうか? 実際には、 これらの部分から、指定した単語を検索して、 置換する、というようなことを実現したいと考えています。 そのため、㍃ 等の部分から日本語の文字列を取得するにはどのようにすればよいのでしょうか?

  • ホームページのURLに日本語を使いたい

    http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=DVXA,DVXA:2005-16,DVXA:ja&q=%E3%82%A6%E3%82%A3%E3%82%AD%E3%83%9A%E3%83%87%E3%82%A3%E3%82%A2 ウィキペディア を グーグルで検索(上記URL)すると、 ja.wikipedia.org/wiki/ウィキペディア - 66k - 2005 というURLがヒットします。 通常、URLには、日本語が入っていませんが、今回の検索結果には、日本語が入っています。 このように、URLに日本語を入れるにはどうしたらいいのでしょうか? また、このように、日本語に最適化することで、グーグルのヒット率はあがるものでしょうか? 以上、宜しくお願い致します。

  • PHPのGETとPOSTの処理を学習中なのですが、valueに日本語が

    PHPのGETとPOSTの処理を学習中なのですが、valueに日本語が入力されていた場合の処理について分からない点があります。 POSTやGETから送信された日本語の値がどの時点で再び日本語に変換されているのかということです。 たとえば以下のようなphpファイルにブラウザからアクセスした場合、 <?php $static = $_GET["static"]; print $static; ?> <form method="GET"> <textarea name="static"> 静的 </textarea> <input type="submit" name="submit_button" value=" 送 信 " /> </form> ブラウザのアドレスバーには"?static=静的%0D%0A&submit_button=+送+信+"という文字列が表示されています。 この"%0D%0"というのは、URLエンコードされた文字列らしいのですが、上記のphpファイル上の"print $static;"部分の表示ではしっかりと日本語として表示されています。 私は上記のソース上のどこの部分でURLエンコードされた文字列が再び日本語として表示されるよう変換されているか分かりません。 何卒ご教授頂けますようお願い致します。

    • ベストアンサー
    • PHP
  • お別れの手紙の暗号解読

    お別れの手紙の暗号解読というクイズなのですが 全然わかりません よかったら誰か答えを教えてください http://quiz-tairiku.com/q.cgi?mode=view&no=26

  • 日本語の変換について

    cgi&Perl初心者です。"greetings.txt"というテキストファイルから指定文字列を検索して出力させるというcgiスクリプトを作りたいのですが、日本語の変換がうまくいきません。バージョンは5.8.8を使っているのですが、encodeモジュールやjcodeを使ってみたのですがどうもうまくいきません…。使い方が間違っているのは明らかなのですが、調べても自分にはどうしてもわからないのです。どなたか教えていただけませんでしょうか?よろしくお願いします。 ちなみに使用しているスクリプトです。 #!C:\Perl\bin\perl use strict; use CGI; my $target_file = "greetings.txt"; my $q = new CGI; print $q->header(), $q->start_html(-title=>'search'); print $q->startform(-method => 'GET', -name => 'myform'), $q->textfield('key'), $q->submit('ok'), $q->endform, "\n"; my $key = quotemeta $q->param('key'); if ($key !~ /^\s*$/) { if (open(F, $target_file)) { my $r = ""; while (<F>) { if (s|($key)|<font color="red">$1</font>|gi) { $r .= $_; } } $r = "NOT FOUND" if ($r eq ""); print "<pre>$r</pre>\n"; } else { print "ERROR: Can't open '$target_file'\n"; } } print $q->end_html(), "\n";

  • CGI.pmで日本語をURLエンコードするとおかしい

    CGI.pmで日本語をURLエンコードするとおかしくなります。 print($q->unescape($q->escape('あ')), "\n"); このコードは文字'あ'をURLエンコードしたものをURLデコードして表示するはずです。 すなわち'あ'と表示するはずです。 しかし実際には'a??'と表示されてしまいます・・・ 何か他の関数をかまさないといけないのでしょうか???

    • ベストアンサー
    • Perl
  • Google検索文字列で日本語入れると落ちる

    お世話になります。WinXPで、IE6.01を使用しています。 Google検索文字列で日本語入力ONにして一文字入れると 頻繁にGoogleがかってに終了してしまいます。 かなりの頻度で発生します。 半角英数を一文字入れて、それから日本語入力ONにすると正常に動作します。 日本語入力はIME2003です。 経験のある方ご指導お願いいたします。

  • httpでもログインフォームは暗号化される?

    phpでトップページログインフォームより会員がログインできる仕組みを作りたいと思っています。 この場合、ログイン認証部分のみSSL通信をおこないたいと考えています。 この場合、 トップページをhttps://toppage.html(sあり)とし、 ログインフォームのaction先を、http://check.php(sなし)のように考えていたのですが、 http://q-shu.net/futsukaichi/ こちらのサイトURLは、トップページがhttpになっており、 会員ログインフォームのaction先がhttps:〇〇〇 となっています。 てっきりログインフォームのあるページURLはhttpsでないと暗号化されないと思っていたのですが、 action先がhttpsになっていれば暗号化されてデータは送られるのでしょうか? ご回答どうかよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 日本語が・・・・

    Yahoo!なんかで検索すると・・・ アドレス部分に検索した文字列が表示されていると思います ABCDとアルファベットで検索したなら、アドレスのsearchの後ろがABCDと、そのまま表示されていますが、 日本語で、あいうえおと検索すると、 %A4%A2%A4%A4%A4%A6%A4%A8%A4%AA という感じになっています。 このように、日本語を%と英数字に変換したい場合はどのようにすると良いでしょうか?

専門家に質問してみよう