プロが教える店舗&オフィスのセキュリティ対策術

Perlのcgi-lib.plでデコードされた文字をUTF-8にエンコードするにはどんなコードを書けば良いのでしょうか。
"あ"という文字をHTMLフォームから受取って%82%A0というS-JISのバイトコードに再エンコードするコードを質問したら

$a = "あ";
$a =~ s/([^a-zA-Z0-9*\-.@_])/sprintf("%%%02X", ord($1))/eg;
$a =~ s/%20/+/g;
print $a;

という答えを頂きました。コードの意味はよく判らなかったのですが、ちゃんと思惑通り$aは%82%A0になりますので長い間重宝にさせていただいています。
今度は$a="あ";の値をUTF-8の%E3%81%82にエンコードしたいのですが、どのように上記のコードを変更すればよいか教えてください。正規表現というのを使えば出来るのでしょうが、本で読んでもやっぱりわかりません。

A 回答 (2件)

"あ"がUTF-8でエンコードされていたら何も考えずに同じコードで


いけると思います。
つまり、ファイルをUTF-8で保存しておくとUTF-8が出力されます。

しかしながら、"あ"が何の文字コードで書かれていたとしてもUTF-8に
変換した上でURLエンコードする方法を教えた方がよいと思うので、
そのコード例を書いてみます。
以下、Perl 5.8以降でしか動作しませんが、5.8以降では標準となる
書き方だと思います。

use CGI;
use Encode qw(from_to);
use Encode::Guess qw/euc-jp shift-jis/;

my $a = "あ";
from_to($a, 'shift-jis', 'utf-8'); # Shift-jisで書かれた"あ"をutf-8に変換
$a = CGI::escape($a); # $aをURLエンコードして$aに代入
print $a;

from_toのところは文字列が不明で推測したいときは'shift-jis'の代わりに
'Guess'を使います。ただ、今回の'あ'のように文字列が短く、
判断が難しい場合は推測に失敗します。

...昔ながらのPerlプログラマーはあまりライブラリを使いたがら
なかったりしますが、ライブラリを使えるところはライブラリを
使った方が楽ですよ。
    • good
    • 0
この回答へのお礼

まずはご回答ありがとうございます。
> "あ"がUTF-8でエンコードされていたら何も考えずに同じコードでいけると思います。

データの送信元のHTMLがUTF-8ならば、一旦cgi-lib.plでデコードされた文字も私が使っているコードのままでUTF-8に再エンコードされるということでしょうか?

> しかしながら、"あ"が何の文字コードで書かれていたとしてもUTF-8に変換した上でURLエンコードする方法を教えた方がよいと思うので・・・

教えていただいたコードを試してみたいと思います。もっとも私のパソコンの環境が古いのでセットアップしなおしからですが、いい機会です。重ねてお礼申し上げます。

お礼日時:2010/05/11 22:35

> データの送信元のHTMLがUTF-8ならば、一旦cgi-lib.plで


> デコードされた文字も私が使っているコードのままでUTF-8に
> 再エンコードされるということでしょうか?

そのとおりです。
ただ、例外としてformにaccept-charsetを指定するなど
送信する際の文字コードを別途指定した場合はそれに従います。



EncodeもCGIもこれまでのライブラリーと同じように使えるようにする書き方と
オブジェクト指向っぽくする書き方の両方ができるのでいろいろと試してみると
面白いと思います。検索するとドキュメントもかなり豊富ですよ。
    • good
    • 0

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