こんにちは!フリーエンジニアのせきです。
PHPには、URLエンコードをする機能が用意されています。
この記事では、
・エンコードとは何か知りたい
・様々なエンコードの種類を知りたい
・URLエンコードする方法を知りたい
という基本的な内容から、
・文字コードを指定してURLエンコードする方法を知りたい
・urlencodeとrawurlencodeの違いが知りたい
といった応用的な内容に関しても解説していきます。
今回はそんなURLエンコードする方法について、わかりやすく解説します!
エンコードとは
エンコードとはデータを他の形式に変換することです。
データは使用する場面によって、そのままでは使用できないことがあります。
その場合、決められた形式で使用できるデータに変換する必要があります。
どのような場面で、どういう変換が必要なのか、次の章で解説していきます。
エンコードの種類
URLエンコード
URLエンコードは、URLとして使用できない文字や記号を、使用できる文字の特殊な組み合わせで表すように変換します。
基本的には、「%」の後ろに使用できない文字の文字コードを16進数で表したものを連結します。
例えば「*(半角アスタリスク)」は、文字コードを16進数で表したものが「2A」なので「%2A」に変換されます。
日本語もURLとして使用できません。
「あ」はUTF-8の場合、文字コードを16進数で表したものが「E3 81 82」なので「%E3%81%82」に変換されます。
PHPでは、urlencode関数、rawurlencode関数でURLエンコードすることができます。
UTF-8エンコード
PHPには、ISO-8859-1(ラテンアルファベットの文字コード)をUTF-8にエンコードするutf8_encode関数があります。
ISO-8859-1はデータベースやXMLでよく使用される文字コードですが、それを世界共通で使われている文字コードであるUTF-8に変換します。
base64エンコード
base64エンコードは、すべてのデータを「A-Z」「a-z」「0-9」「+」「/」の64文字で表すように変換します。
電子メールで画像や音声を送信したり、Webページに画像を埋め込んだり、文字ではないバイナリデータを扱う時に使用されます。
PHPでは、base64_encode関数でbase64エンコードすることができます。
HTMLエンコード
HTMLエンコードは、HTMLの中で特殊な意味を持つ文字を、本来の値が表示できるように決められた形式に変換します。
例えば「<」はHTMLの中でタグの始まりを意味する特殊な文字であり、「<」をHTMLで表示するには「<」に変換する必要があります。
PHPでは、htmlspecialchars関数でHTMLエンコードすることができます。
urlencodeでURLエンコードする
ここでは、urlencode関数でURLエンコードする方法を説明していきます。
基本的な方法
urlencode関数は、以下のように使用します。
urlencode($URLエンコードする文字列)
引数に指定した文字列を、URLエンコードして返します。
URLエンコードするサンプルです。UTF-8で書かれています。
<?php echo urlencode('abc_def'); echo '<br>'; echo urlencode('abc*def'); echo '<br>'; echo urlencode('あい'); ?>
abc_def abc%2Adef %E3%81%82%E3%81%84
一番目のurlencodeに渡した「abc_def」は、すべてURLとして使用できる文字なので、何も変換されません。
二番目の「abc*def」は、「*」がURLとして使用できない文字なので、「%2A」に変換されています。
三番目の「あい」は、日本語でありURLとして使用できない文字なので、「あ」が「%E3%81%82」、「い」が「%E3%81%84」に変換されています。
文字コードを指定してURLエンコードする方法
urlencodeは文字列の文字コードでURLエンコードするので、文字コードを指定することができません。
文字コードを指定してURLエンコードするには、mb_convert_encoding関数を使用し、URLエンコードする文字列を指定の文字コードに変換します。
そして、変換した文字列をURLエンコードします。
mb_convert_encoding関数は、以下のように使用します。
mb_convert_encoding($変換する文字列, $変換後の文字コード, $変換前の文字コード)
第一引数の文字列を、第二引数で指定した文字コードに変換して返します。
文字コードを指定してURLエンコードするサンプルです。UTF-8で書かれています。
<?php $utf8Str = 'あい'; // UTF-8の文字列 echo urlencode($utf8Str); // UTF-8でURLエンコード echo '<br>'; // UTF-8の文字列をSJISに変換 $sjisStr = mb_convert_encoding($utf8Str, 'SJIS', 'UTF-8'); echo urlencode($sjisStr); // SJISでURLエンコード ?>
%E3%81%82%E3%81%84 %82%A0%82%A2
$utf8StrはUTF-8の文字列なので、「urlencode($utf8Str)」でそのままURLエンコードすると、UTF-8でURLエンコードされた「%E3%81%82%E3%81%84」となります。
$sjisStrはmb_convert_encodingを使用し、$utf8StrをUTF-8からSJISに変換した文字列です。
その$sjisStrを「urlencode($sjisStr)」でURLエンコードすると、SJISでURLエンコードされた「%82%A0%82%A2」が返されます。
urlencodeとrawurlencode
rawurlencode関数は、urlencode関数と同様にURLエンコードする関数です。
使い方も同じです。
rawurlencode($URLエンコードする文字列)
引数に指定した文字列を、URLエンコードして返します。
urlencodeとrawurlencodeには、半角スペースと半角チルダ(~)の変換の仕方に違いがあります。
<?php $str = ' '; // 半角スペース echo 'urlencode -> '.urlencode($str); echo '<br>'; echo 'rawurlencode -> '.rawurlencode($str); echo '<br><br>'; $str = '~'; // 半角チルダ echo 'urlencode -> '.urlencode($str); echo '<br>'; echo 'rawurlencode -> '.rawurlencode($str); ?>
urlencode -> + rawurlencode -> %20 urlencode -> %7E rawurlencode -> ~
半角スペースは、urlencode関数では「+」に、rawurlencode関数では「%20」に変換されます。
半角チルダは、urlencode関数では「%7E」に変換され、rawurlencode関数では「~」のまま変換されません。(PHP 5.3.0より前のバージョンではrawurlencode関数も「%7E」に変換されます。)
rawurlencode関数は、インターネットに関する様々な仕様をまとめたRFC3986に沿った変換をしているため、urlencode関数よりrawurlencode関数を使ったほうが安全です。
まとめ
今回はURLエンコードする方法について解説しました。
Webページでリンク先を設定する時などに、URLエンコードはよく使います。
URLエンコードする方法を忘れてしまったら、この記事を思い出して下さい!