URLエンコード
そふぃのPHP入門 >> PHP実践リファレンス >> $_GETと$_POST >> URLエンコード

URLエンコード

GETで日本語を扱うには

前回「GETとPOSTの違い」までで、リクエストにGETを使用した場合のデータ送信方法はURLの後ろに

?sub=GO

のようにクエリがひっついて送信されるのは理解いただけたと思うのですが、このGET方式に日本語のデータを送信する事はできないと解説しました。試してみた方もおられるでしょうが、実際に日本語の文字を直接入力するとおかしな表示になったはずです。

これは日本語が1文字を2バイト分のデータを使用して認識される「マルチバイト文字」というものだからです。

これを回避して日本語のデータを送信するためには「URLエンコード」というものを使用しますが、フォームを使用して<form method="GET">のようにした場合には自動的にURLエンコードされます。

<form action="" method="get">
  <input type="submit" name="sub" value="実行">
</form>

値に日本語を使用しましたが、実際にクリックしてみてURLの部分ををご覧下さい。

良く検索エンジンなどで見られるような

%BC%C2%B9%D4

なんて文字が出てきた事と思いますが、それがURLエンコードというもの結果です。そもそも「エンコード」というのは「あるデータを特定の形式に基づいて変換する事」です。ここでいう「あるデータ」というのは「日本語などのURLとして認められていない文字列」の事です。「特定の形式に変換する」というのはここでは「URLとして認められた文字だけになるように変換する」という事になります。

つまり、日本語なんかでもURL送信できるように一定の規則に基づいた変換を行っているのがURLエンコードです。

参考 IT用語辞典:エンコード

一定の規則ってのがどんな規則に基づいているかはあまり深く考えなくていいです。何故かというと、日本語の「あ」だったらこうで・・・「い」だったらこう・・・なんて私たちがその規則に従ってエディタなどに記述する事はないからです。

URLエンコードとURLデコード

フォームタグを使用すればこのように自動的にURLエンコードされますが、GETでパラメータを渡す利点の一つに<a>タグのhref属性に埋め込む事でハイパーリンクからPHPに値を渡せるという点があります。<a>タグはフォームと違って自動でURLエンコードなんてしてくれませんので、この場合はエンコードした文字列を指定しておかないとなりません。

その場合にはurlencode()関数という便利な関数がPHPに用意されていますのでそれを使用します。urlencode()関数の使用方法はいたって簡単で、引数に文字列を指定するだけです。すると、文字列をURLエンコードした値を返してくれます。

参考関数

  • urlencode() ---- 文字列をURLエンコードする

書式

  • string urlencode( string str )

ここでは例として「name=URLエンコード」という値を送信する場合のスクリプトを挙げます。

<a href="somefile.php?name=<?= urlencode("URLエンコード"); ?>">リンク</a>

実行してみるとhref属性の中にちゃんと「URLエンコード」という文字をURLエンコードした文字列が入っていると思います。この場合のように英数字と日本語の両方が含まれる文字列の場合でもちゃんと日本語の部分がエンコード対象になります。

このようにurlencode()関数を使用する事で簡単にURLエンコードができます。

さて、おまけになりますがURLエンコードした文字列を元に戻す関数もちゃんと用意されています。エンコードしたデータを元に戻す事を「デコード」と言いますが、URLエンコードに対応したデコード関数はurldecode()関数です。そのまんまですねw。

参考関数

  • urldecode() ---- エンコードされたURL文字列をデコードする

書式

  • string urldecode( string str )

こちらは引数にURLエンコードされた文字を指定するとエンコード前の文字列に直してくれるのでぜひ試してみて下さい。アクセス解析で検索単語を知りたい方なんかには必須の関数です。