$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を使ってできる方法があれば教えて下さい。
またそういう機能を持ったライブラリなんかがあるのでしたらそれも教えてもらえるとありがたいです。
No.1ベストアンサー
- 回答日時:
$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
になってしまうのです。
なぜでしょう。
No.2
- 回答日時:
ああ、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されました。
問題は完全に解決しました。
ありがとうございます。
サーバー上のCGIはちゃんと機能し、問題は解決しました。
マックでうまく行かなかったのはJperlだったからなのですか。
>では I18N::Japaneseモジュールの機能を一時的にオフにする
>必要がありますね。
それも試してみたいと思います。
でもCGI、perl、は本当に初心者で、今までコンピューターではPHOTOSHOPしか使ったことがなく、HTMLも一ヶ月前に勉強し始めたばかりというぐらいなので、「I18N::Japaneseモジュールの機能を一時的にオフにする 」ということをどうやってやったらいいのかちょっとわかりませんが、頑張って勉強してみます。仕事で必要なので0から猛烈に勉強中です。
適切、迅速、丁寧な御回答ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ダブルクォート文字などをフォ...
-
大文字、小文字のコードの打ち方
-
エクセルで数値を全角文字(カ...
-
半角・全角の由来
-
「何とかで始まり、何とかで終...
-
Excel・ユーザーフォームの情報...
-
数字を文字列に変換し短縮化する
-
全角入力
-
住宅にカナを入力する際に丁目...
-
VBAでシングルクオート(8217)を...
-
CSVファイルの中で、「 , 」カ...
-
【ExcelVBA】英数記号の半角変換
-
メール(iso-2022-jp-2)のデコ...
-
文字コードの%E3%80%とは何です...
-
VBA(Excel)でファイル内の文字...
-
SJIS->UTF8->SJISコード変換に...
-
角カッコが含まれてるかどうか...
-
プログラミングでは、半角括弧...
-
[VBScript]バイト長の判定
-
Perl 文字化け
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
InputMan の imTextについて
-
文字化けを元に戻せますか?
-
大文字、小文字のコードの打ち方
-
チェックボックスの複数選択の...
-
特殊文字をPOSTした際の動作は?
-
ダブルクォート文字などをフォ...
-
デコード処理について
-
jcode.plについて
-
常用漢字?でない文字を判定す...
-
機種依存文字の文字コード変換
-
formデータのデコード「s///」...
-
index関数と英語文字
-
文字実体参照が勝手に変換され...
-
データが多いとエラーになる:...
-
jcodeを使ったgetcode
-
半角と全角の文字数カウント方法
-
文字をISO Lathin 1 文字コード...
-
文字化けの事で?
-
戻り値の意味がわかりません…
-
CASL2の仕様での英単語の格納方法
おすすめ情報