- 564 名前:nobodyさん mailto:sage [2012/03/09(金) 14:03:28.44 ID:???]
- >>562
ポイントは3つ。 一つ目。 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; はURLデコードするための一文であるということ。 ”テストtestだよ” をURLエンコードすると ”%E3%83%86%E3%82%B9%E3%83%88test%E3%81%A0%E3%82%88”になる。(文字コードはUTF-8) これをデコードして”テストtestだよ”に戻すのがURLデコード。 つまり$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;という一文の役目。 URLエンコードってのは、例えば「テ」(0xe38386)だったら「%E3%83%86」に変換する。 URLデコートってのは、例えば「%E3%83%86」だったら「テ」(0xe38386)に変換する。 2つ目 正規表現のパターンマッチは一つずつ行われる。 $value="%E3%83%86%E3%82%B9%E3%83%88test%E3%81%A0%E3%82%88" に対して $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; をやると、 $1に"E3"が入った状態でpack("C", hex($1))が実行され、文字列"%E3"を0xE3に置換。 $1に"83"が入った状態でpack("C", hex($1))が実行され、文字列"%83"を0x83に置換。 $1に"86"が入った状態でpack("C", hex($1))が実行され、文字列"%86"を0x86に置換。 (以下略)・・・ だからhexやpackにまとめて”%E3%83%86%E3%82%B9%E3%83%88test%E3%81%A0%E3%82%88”入れようとするのは間違い。 3つ目 >なぜ上手くいくのだろう? 多くのマルチバイトな文字コードは、「漢字は○○から始まる」とか「ひらがなは××から始まる」っていうルールを持ってる。 だから半角英数とマルチバイト文字が混在しても問題ない。
|

|