アプリ版:「スタンプのみでお礼する」機能のリリースについて

 検索フォームなどで

main.cgi?mode=open&word=検索文字列

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

よろしくお願いします。

A 回答 (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ではこうやって変換してくることも。)はアンエスケープしてくれないかもしれません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/09/13 07:40

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
    • good
    • 0

こんなのをご所望なのかどうかはわかりませんが



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」になります。

見当違いだったら申し訳ないです。
    • good
    • 0
この回答へのお礼

No.3,4の方のを参考にさせていただきます。

ありがとうございました。

お礼日時:2005/09/13 07:39
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/09/13 07:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!