気の向くままに辿るIT/ICT
webzoit.netウェブサイトホームページ
ホームページ

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

ウェブ造ホーム前へ次へ
サイト内検索
カスタム検索
URLエンコード/URLデコードとは?

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

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

 CGIスクリプトなどでデータを送受信する際に使用されるもので、極力、文字化けを回避してどんな環境でも同じ結果を得るための手法です。

URLエンコード

 特に多バイト文字(マルチバイト文字、日本語、韓国語、中国語等)を0と1からなる数字の並び(ビット・ビットパターン)で様々なことを処理する事ができるコンピュータが理解するにはいくつかの段階が必要です。

 この時、データを送信する側、仲介する側、受け取る側などそれぞれウェブサーバOSを含め様々な環境に対応する事から一般に文字コードと言われるEUC、ASCII、JISなどの標準規格で定められた文字体系もそれらの環境で基本として使われるものも共通とは限りません。

※URLはURIに含まれる定義でURIが公式の呼び方です(IRI/URI/URL/URN)

 こうした事からHTMLXHTMLからscript(スクリプト)に送信する際などブラウザの標準規格としてデータ送信時には何もしなくても『URLエンコード』によってコンピュータが理解しやすいカタチとして


  英数字と一部の記号以外のデータを記号化(英数字と記号)して送信する

ことになっています。

 このようにブラウザネットワーク上に送信する際に記号化・符号化する処理が『URLエンコード』と言われるものです。


◆『URLエンコード』の処理概要

A~Z、a~z、0~9、* - . @ _ はそのまま。
半角スペースは半角の「+」 に変換。
その他はすべて % に16進の2桁の文字コード。
たとえば、「あ」を表す「0x2422」なら「%24%22」になります。


◆『PerlのURLエンコード』

$s1 =~ s/(\W)/sprintf("%%%02X", ord($1))/eg;
$s1 =~ tr/ /+/;

またはunpack関数を利用して

$s1 =~ s/(\W)/'%'.unpack("H2", $1)/eg;
$s1 =~ tr/ /+/;

内容は以下の通りです(『URLデコードPerl処理概要と説明』も参照)。


◆『URLエンコードPerl処理概要と説明』

正規表現の略記『\W』は、単語の構成文字以外にマッチ
『sprintf("%%%02X", ord($1))』は文字装飾・変換をする書式付出力関数
    「%」+「桁数」+「数値(整数、小数点付など)や文字を表す記号」
    で『sprintf()』関数の書式
    「02」は1桁だった場合「0」を付加した2桁を意味する
      更に3つある「%」内のひとつは「%」という文字
      「%」+「2桁の数値」の文字「%▲▲」として出力する指示
    「X」は文字を表す『sprintf()』関数の書式
『ord()』は()内の最初の文字のASCII値を返す関数

URLデコード

 URLデコードは逆にブラウザによって符号化されてネットワーク経由で送られてきた内容を受け取った側で復元して元のカタチに戻す処理です。

 このようにデコードは復号する事ですので符号化するエンコードの反対の処理をしていきます。

 Perlではデコードを以下のように記述することができます。

※『require 'jcode.pl';』やこれに相当するモジュールが必要です。


◆『PerlのURLデコード』

  $s =~ tr/+/ /;
  $s =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg;

または、『chr(hex($1))』(Perl5)をpack関数を利用(Perl4以前)

  $s =~ tr/+/ /;
  $s =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;

 このデコード処理内容は以下の通りです。


◆『URLデコードPerl処理概要と説明』

・『$s』はスカラー変数(名称は「s」でなくてもよい)
・『=~』は特殊変数『$_』以外のスカラー変数に結果を取得する場合
    『$_』から中身を取得して別のスカラー変数に代入する手間がかかる
    これを使うとその手間を省いて「$s」に代入してくれる
・『$s =~ tr/+/ /;』は「+」を「半角スペース」に戻します。
    trは、変換演算子といって、正規表現が使えません。
    その代わり、処理速度が置換演算「s///」より速い。
・『s/置換前/置換後/』は正規表現の置換演算子、『eg』はオプション
    「e」「g」を組み合わせたもの
    「e」式の右側の評価を行なう意味で、chr(hex($1))を評価する
    「g」グローバルな置換で見つかったものをすべて置換する
    ※最適化指定(処理を素早く行うおまじない)である「o」オプションもあるが、
     [o]は同じ置換文字列がある場合、1度、数値文字列処理や変数展開を行えば
     次に同じ数値文字列や変数が出現した場合、処理・展開する手間を省き解釈
      →(実感できるか否かは別として)その分処理が速くなる
・[0-9a-fA-F]は正規表現の文字クラス
・([0-9a-fA-F][0-9a-fA-F])は( )が正規表現のグループ化
    『%』につづく「2桁の英数字」(置換前)を意味する
・『$1』はプログラム上のPerlが自動取得してくれる第1引数の値
・『chr()』は()内の値を文字へ変換する関数
・『hex()』は()内の16進数の値を10進数に変換する関数
    エンコードされた文字は16進数(「%dd」※dは数値)で表現されている為、
    ここでchr()関数またはpack関数でその数値を文字コード1文字に変換
    つまりchr(hex())は10進数に変換された値を元に文字コードに変換

 これでブラウザからまたはWebサーバから送信されてきたデータをCGI Scriptなどが受け取る際に記号化(エンコード)されたデータを復号化(デコード)する事ができるようになりましたね。

 いかがでしたか?

 ここまでできたということは、

 「ネットワーク上に流れるデータと環境を考慮したデータの送受信」

ができるようになったということです。

 ちなみにJavaScriptでは、エンコードにあたるescape()関数デコードにあたるunescape()関数、更には、それよりも推奨されるencodeURI/decodeURIやencodeURIComponent/decodeURIComponent関数が用意されています。

 JavaScript escape/unescape/encodeURI/decodeURI/encodeURIComponent/decodeURIComponent変換フォームを使ってURLのエンコードとデコードを実感してみるのもよいでしょう。

 次は、国や地域に依存する文字コードやOSに依存する改行コードについてみてみましょう。

ウェブ造ホーム前へ次へ