[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2chのread.cgiへ]
Update time : 06/02 01:51 / Filesize : 211 KB / Number-of Response : 664
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Perlコーディング初心者質問スレ Part 63



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つ目
>なぜ上手くいくのだろう?
多くのマルチバイトな文字コードは、「漢字は○○から始まる」とか「ひらがなは××から始まる」っていうルールを持ってる。
だから半角英数とマルチバイト文字が混在しても問題ない。






[ 続きを読む ] / [ 携帯版 ]

全部読む 前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<211KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef