• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:文字をISO Lathin 1 文字コードに変換したい)

文字をISO Lathin 1 文字コードに変換したい

このQ&Aのポイント
  • $name変数に格納されている文字列をISO Lathin 1文字コードに変換したい場合、Perlのpack関数を使用することができます。
  • 具体的には、$name変数の文字列を正規表現を使用してパーセントエンコーディングされた文字列からバイナリデータに変換し、pack関数を使用して文字コードに変換します。
  • 一方、文字列をISO Lathin 1文字コードから元の文字列に戻す場合は、逆の処理を行います。バイナリデータをpack関数を使用してパーセントエンコーディングされた文字列に変換し、正規表現を使用して元の文字列に戻します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

$name=~s/([^a-zA-Z0-9_.-])/uc sprintf("%%%02x",ord($1))/eg; ですね。ちなみにCGI.pmの中にescape, unescapeというその機能の 関数がありますが、これは内部的に使うように設計されています。 つまりCGI.pmを使うと、CGIをプログラムするときは自動的に入出力で 変換してくれるので気にしなくてよくなるようになるのです。

0011001100
質問者

補足

御回答有り難うございます。ただうちのコンピューター(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 になってしまうのです。 なぜでしょう。

その他の回答 (1)

回答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などをお使いになるとき、同様の 処理をする必要があるのでご存知かもしれませんが)

0011001100
質問者

お礼

ありがとうございます。 サーバー上のCGIはちゃんと機能し、問題は解決しました。 マックでうまく行かなかったのはJperlだったからなのですか。 >では I18N::Japaneseモジュールの機能を一時的にオフにする >必要がありますね。 それも試してみたいと思います。 でもCGI、perl、は本当に初心者で、今までコンピューターではPHOTOSHOPしか使ったことがなく、HTMLも一ヶ月前に勉強し始めたばかりというぐらいなので、「I18N::Japaneseモジュールの機能を一時的にオフにする 」ということをどうやってやったらいいのかちょっとわかりませんが、頑張って勉強してみます。仕事で必要なので0から猛烈に勉強中です。 適切、迅速、丁寧な御回答ありがとうございました。

0011001100
質問者

補足

ありがとうございました。 うまくいきました。 $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されました。 問題は完全に解決しました。

関連するQ&A