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

プログラミング学習の挫折率は約90%と言われています。学習を成功させるには、モチベーションを維持して成長を実感できる環境が必要です。

侍エンジニアなら「現役エンジニア講師」、「学習コーチ」、「Q&A掲示板」のトリプルサポート体制であなたの学習をサポートするほか、オーダーメイドカリキュラムで必要なことだけを学べるため、さまざまなランキングでNo1という実績を挙げています。

挫折せず最短でプログラミングを習得したいなら侍エンジニアがおすすめです!

詳しくはこちら

Writer

せき

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

あなたの目的に合わせた
SAMURAI ENGINEERの運営サービス

SAMURAI ENGINEER Pro

未経験でも挫折しないプログラミングスクール

詳細はこちら

SAMURAI TERAKOYA

日本最大級のサブスク型オンラインITスクール

詳細はこちら

SAMURAI ENGINEER Freelance

「一人で稼げる」スキルを身につける

詳細はこちら
Close