- ベストアンサー
文字をISO Lathin 1 文字コードに変換したい
- $name変数に格納されている文字列をISO Lathin 1文字コードに変換したい場合、Perlのpack関数を使用することができます。
- 具体的には、$name変数の文字列を正規表現を使用してパーセントエンコーディングされた文字列からバイナリデータに変換し、pack関数を使用して文字コードに変換します。
- 一方、文字列をISO Lathin 1文字コードから元の文字列に戻す場合は、逆の処理を行います。バイナリデータをpack関数を使用してパーセントエンコーディングされた文字列に変換し、正規表現を使用して元の文字列に戻します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
$name=~s/([^a-zA-Z0-9_.-])/uc sprintf("%%%02x",ord($1))/eg; ですね。ちなみにCGI.pmの中にescape, unescapeというその機能の 関数がありますが、これは内部的に使うように設計されています。 つまりCGI.pmを使うと、CGIをプログラムするときは自動的に入出力で 変換してくれるので気にしなくてよくなるようになるのです。
その他の回答 (1)
- Head_Syndicate
- ベストアンサー率64% (73/113)
ああ、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などをお使いになるとき、同様の 処理をする必要があるのでご存知かもしれませんが)
お礼
ありがとうございます。 サーバー上のCGIはちゃんと機能し、問題は解決しました。 マックでうまく行かなかったのはJperlだったからなのですか。 >では I18N::Japaneseモジュールの機能を一時的にオフにする >必要がありますね。 それも試してみたいと思います。 でもCGI、perl、は本当に初心者で、今までコンピューターではPHOTOSHOPしか使ったことがなく、HTMLも一ヶ月前に勉強し始めたばかりというぐらいなので、「I18N::Japaneseモジュールの機能を一時的にオフにする 」ということをどうやってやったらいいのかちょっとわかりませんが、頑張って勉強してみます。仕事で必要なので0から猛烈に勉強中です。 適切、迅速、丁寧な御回答ありがとうございました。
補足
ありがとうございました。 うまくいきました。 $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されました。 問題は完全に解決しました。
補足
御回答有り難うございます。ただうちのコンピューター(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 になってしまうのです。 なぜでしょう。