プロが教えるわが家の防犯対策術!

$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を使ってできる方法があれば教えて下さい。
またそういう機能を持ったライブラリなんかがあるのでしたらそれも教えてもらえるとありがたいです。

A 回答 (2件)

$name=~s/([^a-zA-Z0-9_.-])/uc sprintf("%%%02x",ord($1))/eg;



ですね。ちなみにCGI.pmの中にescape, unescapeというその機能の
関数がありますが、これは内部的に使うように設計されています。
つまりCGI.pmを使うと、CGIをプログラムするときは自動的に入出力で
変換してくれるので気にしなくてよくなるようになるのです。

この回答への補足

御回答有り難うございます。ただうちのコンピューター(Macintosh,MacJparl)で

$name="%8B%B3%82%A6%82%C4";
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
print"$name\n";
$name=~s/([^a-zA-Z0-9_.-])/uc sprintf("%%%02x",ord($1))/eg;
print"$name\n";

とやってみたのですが、

教えて
%8B%82%82

というふうにprintされます。

%8B%B3%82%A6%82%C4

となってほしいのに

%8B%82%82

になってしまうのです。
なぜでしょう。

補足日時:2001/05/12 19:59
    • good
    • 0

ああ、Jperlをおつかいなのですね。


では I18N::Japaneseモジュールの機能を一時的にオフにする
必要がありますね。
no I18N::Japanese;
$name =~ s/([^a-zA-Z0-9_.-])/uc sprintf("%%%02x",ord($1))/eg;
use I18N::Japanese;

MacOSが手元にないので試せませんが、これでうまくいくのではないですか。

先のコードはアルファベットか数字以外の字を一文字ずつ(1バイトずつ)
処理しようとしますが、Jperlだと正規表現の動作が変わり、全角文字
ひとつにマッチするので、つまり2バイトずつ処理してしまいます。
(お試しになったコードが妙に短いのはそのせいです。6バイトなので
%??が6個のはずが、「教えて」の3文字で3個になっています)

no I18N::Japanese;はこの正規表現その他日本語用の処理を一時的に
オフにする機能です。(jcode.plなどをお使いになるとき、同様の
処理をする必要があるのでご存知かもしれませんが)

この回答への補足

ありがとうございました。
うまくいきました。
$name="%8B%B3%82%A6%82%C4";
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

print"$name\n";

no I18N::Japanese;
$name =~ s/([^a-zA-Z0-9_.-])/uc sprintf("%%%02x",ord($1))/eg;
use I18N::Japanese;

print"$name\n";

としたらちゃんと

教えて
%8B%B3%82%A6%82%C4

とprintされました。

問題は完全に解決しました。

補足日時:2001/05/12 22:57
    • good
    • 0
この回答へのお礼

ありがとうございます。
サーバー上のCGIはちゃんと機能し、問題は解決しました。

マックでうまく行かなかったのはJperlだったからなのですか。

>では I18N::Japaneseモジュールの機能を一時的にオフにする
>必要がありますね。

それも試してみたいと思います。

でもCGI、perl、は本当に初心者で、今までコンピューターではPHOTOSHOPしか使ったことがなく、HTMLも一ヶ月前に勉強し始めたばかりというぐらいなので、「I18N::Japaneseモジュールの機能を一時的にオフにする 」ということをどうやってやったらいいのかちょっとわかりませんが、頑張って勉強してみます。仕事で必要なので0から猛烈に勉強中です。

適切、迅速、丁寧な御回答ありがとうございました。

お礼日時:2001/05/12 22:55

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