コンピューターサイエンス入門:理論編
URL エンコード対象文字数
この回でやること
URLに組み込む値の置き換え対象を読み解き、入力の文字数と変換後の長さを区別します。
- 読む 約 7 分
- 最後にクイズ 1 問
検索語に空白や日本語を入れてURLを作ると、%E3%81%AD のような文字列が現れます。壊れたのではありません。そのままでは置けない文字を、別の表記に置き換えています。
区切りと値を見分けるための置き換え
URLでは記号が区切りの役割を持ちます。? はクエリの始まり、& は次のパラメータ、/ は階層の区切りです。検索語そのものにこうした記号が入ると、区切りなのか値の一部なのかを見分ける必要があります。
値のバイトを % と16進数2桁に直すのが、パーセントエンコーディングです。URL全体の区切りまで置き換えるのではなく、組み込む値に適用します。
この回では数え方を揃え、英字、数字、4つの記号 - _ . ~ 以外をすべて対象にします。この範囲はRFC 3986でunreservedと呼ばれます。空白、+、=、日本語は対象です。. は対象ではありません。実際の変換規則は、値を置く場所や使う方式によって違うことがあります。
入力の文字数と出力の長さは違う
「ね」はUTF-8で3バイトなので、%E3%81%AD という3組になります。出力は9文字でも、入力で置き換え対象になるのは1文字です。「日本語の文字数」「バイト数」「%XXの組数」を混ぜずに数えます。
プレーンテキスト
入力の空白1文字 → %20 → 出力は3文字
入力の「ね」1文字 → %E3%81%AD → 出力は9文字漢字やひらがなの多くは3バイトですが、すべての文字がそうとは限りません。対象が何文字か分かっても、種類が分からなければ出力の長さは決まりません。
現場では、URLの長さに上限がある経路へ渡す前に、変換後の長さも確かめます。日本語の検索語は、見た目が短くても変換後に長くなります。空白を + にする方式もありますが、この回では %20 として扱います。
対象かどうかを1文字ずつ見る
入力を1文字ずつ見て、英字、数字、4つの記号なら数えず、それ以外なら1つと数えます。同じ記号が2回現れたら2つです。種類の数を求めているわけではありません。
例題で確かめる
検索語が「検索 A」の場合を考えます。「検」「索」と空白が対象で、「A」はそのままです。対象は3文字になります。漢字2文字は各3バイト、空白は1バイトなので、%XXは7組です。出力は「%E6%A4%9C%E7%B4%A2%20A」で、7 × 3 + 1 = 22文字になります。対象の3と出力の22は、別の数です。