Unicode文字のURLエンコード

UTF-8 percent-encodingを使ったUnicode文字のURLエンコード方法を解説。マルチバイトエンコード、国際文字、特殊記号のURL内での扱いを学びましょう。

Character

Unicode

Encoded

%E2%9C%93

詳細な説明

ASCII範囲外(コードポイント127以上)のUnicode文字は、UTF-8バイトシーケンスを使ってURLにエンコードする必要があり、各バイトが個別にpercent-encodingされます。例えば、チェックマーク文字(✓)はUTF-8表現が3バイト(0xE2、0x9C、0x93)であるため、%E2%9C%93にエンコードされます。

Unicode URLエンコードの仕組み:

  1. 文字をUTF-8バイトシーケンスに変換する
  2. 各バイトをHHが16進数値の%HHとしてpercent-encodingする

例えば、ユーロ記号(€)の場合:

  • Unicodeコードポイント:U+20AC
  • UTF-8バイト:0xE2、0x82、0xAC
  • URLエンコード:%E2%82%AC

JavaScriptでの動作:

encodeURIComponent("✓")     // "%E2%9C%93" (チェックマーク、3バイト)
encodeURIComponent("é")     // "%C3%A9" (アクセント付きe、2バイト)
encodeURIComponent("€")     // "%E2%82%AC" (ユーロ記号、3バイト)
encodeURIComponent("你好")   // "%E4%BD%A0%E5%A5%BD" (中国語の「こんにちは」、各3バイト)

// デコード
decodeURIComponent("%E2%9C%93") // "✓"

コードポイント範囲ごとのバイト長:

  • U+0000〜U+007F: 1バイト(ASCII、例:A = %41
  • U+0080〜U+07FF: 2バイト(例:é = %C3%A9
  • U+0800〜U+FFFF: 3バイト(例: = %E2%9C%93
  • U+10000〜U+10FFFF: 4バイト(例:絵文字、encode-emojiを参照)

重要: JavaScriptのencodeURIComponent()関数は常にUTF-8エンコードを使用します。これはRFC 3986で義務付けられた標準です。古いシステムでは他のエンコード(ISO-8859-1やShift-JISなど)を使用する場合があり、同じ文字に対して異なるバイトシーケンスを生成します。デコード後に文字化けが発生した場合、エンコードの不一致が原因である可能性が高いです。

国際化リソース識別子(IRI): RFC 3987はURIの拡張としてIRIを定義しており、Unicode文字を直接使用できます。モダンブラウザはアドレスバーにUnicode文字を表示しますが、HTTPリクエストではpercent-encoded形式で送信します。URLをコピーする際に混乱が生じることがあります:表示されるURLと送信されるURLが異なって見える場合があるからです。

落とし穴: Unicodeテキストの場合、URLの長さ制限が実用上の問題になります。各文字が3〜12のpercent-encoding文字に展開される可能性があるためです(各UTF-8バイトが%E2のような3文字になる)。100文字の中国語文字列はpercent-encodingすると約900文字に展開される可能性があります。

ユースケース

多言語検索URLや、アクセント付き文字・CJK文字・記号などの非ASCII文字を含む国際化されたAPIリクエストの構築。

Try It — URL Encoder

フルツールを開く