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エンコードの仕組み:
- 文字をUTF-8バイトシーケンスに変換する
- 各バイトを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リクエストの構築。