URLの%は文字化け?URLエンコードを分かりやすく説明!

日本語を使ったURLが、日本語が表示されずに%をふくむ文字化けのような記号列として表示されるのをよく見かけますよね。
これは、決してブラウザやアプリの不具合ではなく、URLエンコードというコード変換を施した結果を表示しているからなのです。

今回はこのURLのエンコード・デコードについて、その概要や留意事項をわかりやすく説明します。
ホームページの作成・管理やシステム開発の参考にぜひ読んでみてください。

URLとは?

WebやSNSで当たり前のように利用しているURLですが、URLとはどのようなものかを、以下で整理しておきます。

URLの定義

インターネット上の情報を、スマホやタブレット、パソコンなどいろんな機器で手軽に検索して内容を閲覧することができます。

これは手元の機器(WEBクライアント)からインターネット上のWEBサーバにリクエストを出し、WEBサーバに格納されてる情報(WEBコンテンツ)を送信してもらうからです。

では、WEBコンテンツを指定するにはどうすればよいのでしょう?
その仕掛けとして、URL、URN、URIというものが規定されています。

URLは「Uniform Resource Locator」の略称で、インターネット上に存在する文書や画像などのWEBコンテンツのありかを示す技術方式。いわば、WEBコンテンツの住所(アドレス)のようなものですね。

URNは「Uniform Resource Name」の略称です。Nameは名前という意味ですが、URNはどちらかというと固有の識別番号のイメージ。利用者が意識することはほとんどなく、WEBシステムが利用するための番号です。

URIは、「Uniform Resource Identifier」の略称で、URIとURNを総称するもの

いろいろありますが、WEBのユーザーはURLを使ってWEBコンテンツにアクセスしていると考えてよいでしょう。

URLを記述するための構文

URL(URI)の構文は以下のとおりです。

<プロトコル>://<ドメイン>:<ポート番号>/<パス>?<パラメータ>#<アンカー>

具体的な例を以下に示します。

URL記述例

構成要素の説明を以下に示します。

構成要素 説明
プロトコル インターネットでデータのやり取りや転送を行なうための設定方法を示す。
「http」が一般的であり、「https」は通信のセキュリティ確保のため暗号化した通信を行なうもの。
ドメイン名 IPアドレスを分かりやすくするために設定する文字列
ポート WEBサーバ上のリソースにアクセスするための「ゲート」を表す番号
標準(HTTPは80、HTTPSは443)なら省略可能
パス  WEBサーバ上でのリソースのパス
パラメータ 追加の引数で、以下の形式で指定する。(省略可能)
?<キー1>=<値1>&<キー2>=<値2>…
アンカー リソース内のいわばブックマーク(省略可能)
#で始まる文字列でフラグメント識別子とも呼ばれる。

なぜURLエンコード・デコードは必要?

ユーザーが記述したURLがWEBクライアントからWEBサーバに送られるときはURLエンコードという変換操作が行なわれます。以下ではURLエンコード・デコードが必要な理由を説明します。

URL(URI)には特別な役割を持つ制御文字が決められている。

URLの構文においては、特別な役割を持つ文字(予約文字)があり、この文字を予約文字以外の用途で使いたいときは「%」の後に2桁の16進数で表わします。例えば、「/」は、UTF-8を使用していれば「%2F」と表します。
このため、URLエンコーディングは、パーセントエンコーディング( percent encoding)と呼ばれることもあります。

予約文字の例

予約文字 ! # $ & ( ) * + ,
unicode 0021 0023 0024 0026 0027 0028 0029 002A 002B 002C
予約文字 / : ; = ? @ [ ]
unicode 002F 003A 003B 003D 003F 0040 005B 005D

なお、「~」や「.」は予約文字になっていませんが、予約文字に準じる扱いとした方が無難です。

URLをいろんな言語で使えるようにする

インターネットは世界中の人が利用しているため、いろんな言語で利用できるように、コンピュータで扱う文字コードもいろんな種類が規定されています。

代表的な文字コードには以下のものがあります。

文字コード 説明
ASCIIコード アメリカ規格協会(ANSI)が制定した文字コード
アルファベット、数字、記号、空白、制御文字など128文字を規定
JISコード 平仮名、片仮名、漢字などの日本語を定義
Shift-JISコード Microsoft社により定められたコードでWindowsで使用
全ての文字を2バイトで扱い、表示文字数とバイト数が一致する
EUC UNIX上で漢字、中国語、韓国語などを扱うことができる
unicode アルファベット、漢字、カナ、アラビア文字など世界中の文字を表現
JavaやXMLが基本コードとして採用、符号化方式はUTF-8が多い

URLは元々英語での利用を想定されているためASCIIコードをベースとしており、漢字などは使用することができないのです。
このため、ASCIIコード表で定義されていない文字はパーセントエンコーディングすることとされています。

WEBやプログラムでURLエンコード・デコードする際の注意点

HTTPでの処理

WEBクライアントからWEBサーバにHTTPでHTMLファイルなどを送ってもらうよう要求する場合には、GETメソッドやPOSTメソッドを使います。
POSTメソッドでは「application/x-www-form-URLencoded」によりURLをエンコードします。
この場合は、以下の点に留意が必要です。

  • 半角スペースを「%20」ではなく「+」で表わす。

Javaでの処理

JavaでURLをエンコード・デコードする方法としては、

  • java.net.URLEncoder / URLDecoder Java標準
  • Apache Commons Codec の URLCodec クラス

があります。

これらのJava 言語でのURLエンコード処理では、以下の点に留意が必要です。

  • 「*」「-」「_」の3つの記号が変換されません。
  • 半角スペースは「%20」ではなく「+」に置き換わります。

JavaScriptでの処理

JavaScriptでは、エンコード・デコードに使える関数として以下のものがあります。

encodeURI 入力された文字列内の予約文字はエンコードしない
decodeURI 入力された文字列内の予約文字はデコードしない
encodeURIComponent 入力された文字列内の予約文字もエンコードする
decodeURIComponent 入力された文字列内の予約文字もデコードする

以下に使用例を示します。

<プログラム>

<実行結果>

encodeURIComponent関数では、「:」や「/」もエンコードしていることがわかりますね。

なお、上記の関数では、以下の点に留意が必要です。

  • 半角スペースを「%20」と変換する。

まとめ

いかがでしたか?今回は、URLエンコード・デコードについて説明しました。
ユーザーとしてWebで検索したり、ファイル転送を行なったりしている場合はあまり気にしなかったことですが、Webサイトの管理を始めたり、WEBプログラミングを始めると問題になる場合があります。
この記事が、Webサイト管理やプログラミング言語の学習などのお役に立てば幸いです。

BLOGコンテンツをパーソナライズします

あなたは現在「プログラミング学習者」ですか?