$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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAでのフルパスの取得 1 2022/09/20 22:51
- 英語 of の必要性と意味 2 2022/07/31 17:09
- その他(生活家電) 電熱ヒーターパッド(17×24cm)の電源がすぐに切れるので困っています。 2 2022/12/20 13:31
- その他(ネットショッピング・通販・ECサイト) 何度、注文しても 間違った商品が届く 4 2022/08/26 13:48
- その他(暮らし・生活・行事) モニタ上部の余ったスペースを収納にする方法 3 2023/03/12 17:40
- 数学 対角線論法破れたり!? 2 2023/05/29 16:18
- 生物学 ヒトの歯が何度でも生えるように進化しなかったのはなぜ 3 2022/12/10 10:09
- Word(ワード) リンクが作動しない 7 2022/12/23 14:15
- iPhone(アイフォーン) こちらWEB検索できるかが分かりません それからこちらの最安値があれば教えてください https:/ 2 2022/09/14 14:09
- Excel(エクセル) エクセルで特定の列を素早く出す方法 4 2022/07/29 01:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
jcodeでsjisに変換できない
-
ダブルクォート文字などをフォ...
-
文字化けの事で?
-
InputMan の imTextについて
-
戻り値の意味がわかりません…
-
正規表現でカンマを対象にする方法
-
デコード処理について
-
機種依存文字の文字コード変換
-
CSVファイルの中で、「 , 」カ...
-
マクロを使ってフォルダー内に...
-
英数字のみ全角から半角に変換
-
「何とかで始まり、何とかで終...
-
エクセルで数値を全角文字(カ...
-
EXCELからCSVにすると余計なカ...
-
エクセルにMicrosoft Barcode C...
-
カンマ区切りの数字をCSVフ...
-
各項目がダブルクォーテーショ...
-
Excel VBAでPDFファイルをMicro...
-
住宅にカナを入力する際に丁目...
-
csvデータ ダブルクォーテ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
InputMan の imTextについて
-
ダブルクォート文字などをフォ...
-
正規表現でカンマを対象にする方法
-
文字実体参照が勝手に変換され...
-
常用漢字?でない文字を判定す...
-
文字化けを元に戻せますか?
-
戻り値の意味がわかりません…
-
チェックボックスの複数選択の...
-
「数値文字参照への変換するソ...
-
jcode.plについて
-
SUBMIT時の入力文字のURLエンコ...
-
半角カナを検出したい
-
utf-8のマシンでsjisのデータフ...
-
jcode.plのバグでしょうか?KCc...
-
Jcode.pmでの半角カナ→全角カナ...
-
文字をISO Lathin 1 文字コード...
-
機種依存文字の文字コード変換
-
パターンマッチ変換について
-
文字コード
-
index関数と英語文字
おすすめ情報