連載
» 2008年01月18日 00時00分 公開

もいちどイチから! HTTP基礎訓練中(4):その文字列はセーフ? 本当は奥深いデコード処理 (1/3)

今日も楽しいメッセンジャータイム! ところが、ジュンさんから飛んできたのはまったく読めないけど、どこかで見たような文字列でした。今回は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」の文字に置き換えられ、パーセントエンコードを行う前の文字列に復元される。

                       @IT messenger v1.4

クウ で、さっきのパーセントエンコードのやつは、なんていってたんですか?


ジュン そこは自分でデコードしてみてほしいな


クウ デコードっすか……。そこらへんは、モジュールに任せっきりだからやり方分かんないかもです……


ジュン ふむ。デコード結果を出力する自分用のWebアプリとか作っておくと便利だよー。

クウ なるほどぉ。そういうの手元に持っておいた方がいいかもしれないですねぇ。

ジュン ま、取りあえずは、コマンドラインとかでデコードする方法を教えておくよ。

クウ おおっ! ありがとうございます!


デコードするのは意外と簡単、なのに「奥が深い」?

 「あ」のような日本語がパーセントエンコードされた「%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

クウ えっと。ちょっと待ってくださいね……。

「パーセントエンコードは基本なようで奥が深いから押さえておいた方がいいよ!」

っすね。なるほどー♪

ジュン 変換するのめんどくさくなってきたから普通に打つね(笑)。

クウ はい。ぜひに(笑)。

ジュン 結構軽視されがちだけど、意外と理解しておかないといけないのよね、これが。

クウ でも、これって、ブラウザとかモジュールとかが勝手にやってくれるからあまり意識しなくてもいいんじゃないですかね。

ジュン それがそうでもないんだなー。

クウ ほう……。そうなんですかぁ。

ジュン ちと席外すねー。すぐ帰ってくるけど


クウ あ、はいー。

システム ジュンは離席中です


クウ 「パーセントエンコードはちゃんと勉強しておいた方がいいかもなあ……」

       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。