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

Perl CGIについてです。
文字列をエンコードしようと次のようにしてみました。

$val1 =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg;
$val2 =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg;

$va1は問題なくエンコードされ、デコードも元文字に戻ったのですが、
$va2のエンコード文字に不要な'25'が含まれるようになってしまいました。

例:「ガム」をエンコード >> %A5%AC%A5%E0 
を期待していたのですが、結果は %25A5%25AC%25A5%25E0

と不要に'25'が含まれてしまいました。unpackの文が悪いのでしょうか?ご教示ください。

A 回答 (2件)

$val1と$val2は両方とも同じ“ガム”が入ってますか?



> 結果は %25A5%25AC%25A5%25E0
をみると、二重にエンコードしているように見えるんですが。

この回答への補足

早速の回答ありがとうございます。

$val1には「おやつ」が入り、$val2には「ガム」を入力しようとしました。
$val1の価は問題なく入ったのですが、$val2には上記のような結果となり、
デコードすると文字として「%%A5%AC%A5%E0」が表示され、本来の「ガム」が
表示できませんでした。

2重にエンコードというと$val1でunpackした結果が要因したのでしょうか?
大変助かります。ありがとうございます。

補足日時:2007/08/24 13:20
    • good
    • 0

> 重にエンコードというと$val1でunpackした結果が要因したのでしょうか?



ちがいます。
多分euc-jpを使っていると思いますが、それだと
“ガム”は A5 AC A5 E0 ですよね。
で、これを質問にあるエンコーディングで変換すると

%A5%AC%A5%E0 

となります(期待している結果でもありますが)。
ここで、さらにこれに対して同じ処理を加えると

%25A5%25AC%25A5%25E0

になりますので、「二重にエンコーディングをかけていないか?」
と書いたのです。
#% は %25 に変換され、その他はそのままになります

ということなので

> デコードすると文字として「%%A5%AC%A5% E0」が表示され、本来の「ガム」が

ここでデコードしているつもりでもう一回エンコードしているんじゃないでしょうか?

変換しないでそのまま出すとどうなりますか?

この回答への補足

返信が遅くなってしまい申し訳ございません。二重エンコード、思い当たる
節があるので、ちょっと直してみます。 その結果、またお知らせしたいと思います。 アドバイス、大変感謝いたします。

補足日時:2007/08/28 09:34
    • good
    • 0
この回答へのお礼

変換しないでやったら、問題なく表示されました。
ありがとうございました。

お礼日時:2007/08/31 10:35

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