【PHP入門】URLエンコードする方法(urlencode)

こんにちは!フリーエンジニアのせきです。

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で表示するには「&lt;」に変換する必要があります。

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エンコードする方法を忘れてしまったら、この記事を思い出して下さい!

この記事を書いた人

フリーランスでWebシステム開発やゲーム開発をしています。
読者の方にプログラミングの面白さをお伝えしたいです。

目次