今日も楽しいメッセンジャータイム! ところが、ジュンさんから飛んできたのはまったく読めないけど、どこかで見たような文字列でした。今回はHTTPを取り扱う上では欠かせない「パーセントエンコード」について、気をつけなくてはならないことを学んでいきましょう(編集部)
@IT messenger v1.4
ジュン %82%b1%82%f1%82%ce%82%f1%82%cd%81%5b
クウ お。こんばんは〜。こないだの勉強会はありがとうございました。楽しかったです♪
ジュン %8a%79%82%b5%82%f1%82%c5%82%e0%82%e7%82%a6%82%bd%82%dd%82%bd%82%a2%82%c5%82%e6%82%a9%82%c1%82%bd%82%9f
クウ ちょっとどしたんすか?! なんか文字化けしてますよっ。
ジュン %95%b6%8e%9a%89%bb%82%af%82%b6%82%e1%82%c8%82%a2%82%e6%82%c1%81%49
クウ むむむ……
ジュン これで会話できるかな? って思ったけど唐突だったか〜
クウ え? 文字化けしてるとかじゃなくてなんか意味あったんすか?
ジュン そうそうー。パーセントエンコードで話し掛けてみたの
クウ ふむふむ。パーセントエンコードっすか。そういえばよく見る形だなって思ったです。
パーセントエンコード(いわゆるURLエンコード)とは、文字のコードを16進数で表し、「%xx」(xxは16進数)という形に変換するエンコード方式のことである。
URLに含まれる非ASCII文字および一部のASCII文字が「%xx」の形に変換される(RFC:3986では、percent-encodingとして解説されている)。例を挙げると、「半角スペース」のコードは「20」となるため、パーセントエンコードを用いて表現すると「%20」となる。
実際に、HTTP通信ではパーセントエンコードが、URLのパスおよびQueryString(GETパラメータ)部分や、リクエストボディ(Content-Typeがapplication/x-www-form-urlencodedの場合のPOSTパラメータ)などで頻繁に利用されている。
POST /percent_encode.html?mode=%83e%83X%83g HTTP/1.0 Host: localhost User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9, text/plain;q=0.8, image/png,*/*;q=0.5 Accept-Language: ja,en-us;q=0.7,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Proxy-Connection: keep-alive Referer: http://localhost/percent_encode.html?mode=%83e%83X%83g Content-Type: application/x-www-form-urlencoded Content-Length: 56 name=%83N%83E&address=%93%8C%8B%9E%93s&button=%91%97%90M |
リスト1 HTTP通信ではパーセントエンコードが利用されている |
HTTPにおいて、日本語などのマルチバイトで表現されたデータを送信する際には、パーセントエンコードが用いられることが多い。例えば、SHIFT_JISで書かれた「あ」であれば「%82%a0」、「い」であれば「%82%a2」という形に変換される。
Webアプリケーションなどでは、このパーセントエンコードにより記述された文字列から、元の文字列を取り出すための作業を行う必要があり、この処理をデコード処理と呼ぶ。通常のデコード処理では、「%xx」で記述された文字列は、コードが「xx」の文字に置き換えられ、パーセントエンコードを行う前の文字列に復元される。
「あ」のような日本語がパーセントエンコードされた「%82%a0」が元の文字列に戻ったことを確認するには、実際に利用される環境と同じようにWebアプリケーションを利用して出力を行う形が確実である。
<?php echo htmlspecialchars($_GET['text']); ?> |
リスト2 PHPでデコードを行うシンプルな例 http://localhost/decode.php?text=[パーセントエンコード文字列]のような形でアクセスを行う |
また、Webアプリケーションを利用しない場合でも、以下のような手段で確認を行うことは可能である。
デコード方法例 | |
---|---|
Windows | IMEの日本語入力で、「%」を取り除いた「82a0」と入力し、F5キーを押す (ASCII文字については先頭に「00」の補完が必要) |
Linux | 以下のコマンドを実行 > echo '%82%a0' | tr % = | nkf -mQ |
表1 Windows、Linuxでのデコード方法例 |
@IT messenger v1.4
クウ フムフム……。なるほど。パーセントエンコードってこんなんなってるんすねー。いままであんまりちゃんと考えたことなかったなぁ。
ジュン %83%70%81%5b%83%5a%83%93%83%67%83%47%83%93%83%52%81%5b%83%68%82%cd%8a%ee%96%7b%82%c8%82%e6%82%a4%82%c5%89%9c%82%aa%90%5b%82%a2%82%a9%82%e7%82%a8%82%b3%82%a6%82%c4%82%a8%82%a2%82%bd%82%d9%82%a4%82%aa%82%a2%82%a2%82%e6%81%49
クウ えっと。ちょっと待ってくださいね……。
「パーセントエンコードは基本なようで奥が深いから押さえておいた方がいいよ!」
っすね。なるほどー♪
ジュン 変換するのめんどくさくなってきたから普通に打つね(笑)。
クウ はい。ぜひに(笑)。
ジュン 結構軽視されがちだけど、意外と理解しておかないといけないのよね、これが。
クウ でも、これって、ブラウザとかモジュールとかが勝手にやってくれるからあまり意識しなくてもいいんじゃないですかね。
ジュン それがそうでもないんだなー。
クウ ほう……。そうなんですかぁ。
ジュン ちと席外すねー。すぐ帰ってくるけど
クウ あ、はいー。
システム ジュンは離席中です
クウ 「パーセントエンコードはちゃんと勉強しておいた方がいいかもなあ……」
Copyright © ITmedia, Inc. All Rights Reserved.