調べて分かる道具箱

URLエンコードの早見表と変換

貼った文字はこの画面の中だけで変換します。外の機械に問い合わせることも、 どこかに送ることもありません。文字数の上限もありません。

見本でためす
どちらの向きで読むか

「%」と16進2桁の並びが見つからないので、エンコード(URLに置ける形にする)として読みました。もとに戻したいときは上の3つから選び直してください。

URLのかけら向きWHATWG URL Standard の component percent-encode set(空白は %20)https%3A%2F%2Fpotamo.net%2F%E9%81%93%E5%85%B7%3Fq%3D%E3%83%88%E3%83%A0%26%E3%82%B8%E3%82%A7%E3%83%AA%E3%83%BC%26p%3D2%23top
URL丸ごと向きECMA-262 の encodeURI 相当。; / ? : @ & = + $ , # を残す(空白は %20)https://potamo.net/%E9%81%93%E5%85%B7?q=%E3%83%88%E3%83%A0&%E3%82%B8%E3%82%A7%E3%83%AA%E3%83%BC&p=2#top
フォームが送る形application/x-www-form-urlencoded。残す文字は WHATWG URL Standard §1.3 の form set(英数字と * - . _ だけ)、空白を + にするのは RFC 1866 §8.2.1https%3A%2F%2Fpotamo.net%2F%E9%81%93%E5%85%B7%3Fq%3D%E3%83%88%E3%83%A0%26%E3%82%B8%E3%82%A7%E3%83%AA%E3%83%BC%26p%3D2%23top
1文字ずつの内訳文字 → 文字番号(U+) → バイト → %表記 の4段。絵文字の合成は1文字として数えています
文字文字番号バイト(16進)%表記種類
hU+006868%68そのまま書ける
tU+007474%74そのまま書ける
tU+007474%74そのまま書ける
pU+007070%70そのまま書ける
sU+007373%73そのまま書ける
:U+003A3A%3A大きな区切り
/U+002F2F%2F大きな区切り
/U+002F2F%2F大きな区切り
pU+007070%70そのまま書ける
oU+006F6F%6Fそのまま書ける
tU+007474%74そのまま書ける
aU+006161%61そのまま書ける
mU+006D6D%6Dそのまま書ける
oU+006F6F%6Fそのまま書ける
.U+002E2E%2Eそのまま書ける
nU+006E6E%6Eそのまま書ける
eU+006565%65そのまま書ける
tU+007474%74そのまま書ける
/U+002F2F%2F大きな区切り
道U+9053E9 81 93%E9%81%93ASCIIの外
具U+5177E5 85 B7%E5%85%B7ASCIIの外
?U+003F3F%3F大きな区切り
qU+007171%71そのまま書ける
=U+003D3D%3D小さな区切り
トU+30C8E3 83 88%E3%83%88ASCIIの外
ムU+30E0E3 83 A0%E3%83%A0ASCIIの外
&U+002626%26小さな区切り
ジU+30B8E3 82 B8%E3%82%B8ASCIIの外
ェU+30A7E3 82 A7%E3%82%A7ASCIIの外
リU+30EAE3 83 AA%E3%83%AAASCIIの外
ーU+30FCE3 83 BC%E3%83%BCASCIIの外
&U+002626%26小さな区切り
pU+007070%70そのまま書ける
=U+003D3D%3D小さな区切り
2U+003232%32そのまま書ける
#U+002323%23大きな区切り
tU+007474%74そのまま書ける
oU+006F6F%6Fそのまま書ける
pU+007070%70そのまま書ける

この 39 文字を全部バイトにすると 55 バイトです。

URLの区画どの記号がいま「区切り」として働いているか
かけらはたらき
httpsしくみの名前(スキーム)
:ここまでがしくみの名前ここが区切り
//ここから住所ここが区切り
potamo.net住所(ホスト)
/道の区切りここが区切り
道具道(パス)
?ここから問い合わせここが区切り
q項目の名前
=名前と値の境目ここが区切り
トム項目の値
&項目の切れ目ここが区切り
ジェリー問い合わせ(クエリ)
&項目の切れ目ここが区切り
p項目の名前
=名前と値の境目ここが区切り
2項目の値
#ここからページの中の位置ここが区切り
topページの中の位置(フラグメント)

ASCII 128文字の早見表

0から127までを、1つも飛ばさずに並べました。目に見えない制御文字33個も、空欄にせず名前で出しています。 右の3列は「その形にしたとき、どう出るか」です ── そのまま残る文字はその文字が、 化ける文字は %XX が入ります。

そのまま書ける英字52・数字10と、そのほか4つ
66 文字
大きな区切りURLを大きく区切る記号
7 文字
小さな区切り問い合わせの中などを区切る記号
11 文字
どこでも要変換区切りの役も無く、そのままでは置けない
11 文字
制御文字画面に出ない文字(0x00〜0x1F と 0x7F)
33 文字

足し算にすると 66+7+11+11=95(印字できるASCII)、95+33=128。 この表は条文の集合の決まりから組み立てているので、行を書き写す作業がありません。

16進10進文字%表記URLのかけら向きURL丸ごと向きフォームが送る形種類
000NUL Null%00%00%00%00制御文字
011SOH Start of Heading%01%01%01%01制御文字
022STX Start of Text%02%02%02%02制御文字
033ETX End of Text%03%03%03%03制御文字
044EOT End of Transmission%04%04%04%04制御文字
055ENQ Enquiry%05%05%05%05制御文字
066ACK Acknowledge%06%06%06%06制御文字
077BEL Bell%07%07%07%07制御文字
088BS Backspace%08%08%08%08制御文字
099HT Horizontal Tabulation%09%09%09%09制御文字
0A10LF Line Feed%0A%0A%0A%0A制御文字
0B11VT Vertical Tabulation%0B%0B%0B%0B制御文字
0C12FF Form Feed%0C%0C%0C%0C制御文字
0D13CR Carriage Return%0D%0D%0D%0D制御文字
0E14SO Shift Out%0E%0E%0E%0E制御文字
0F15SI Shift In%0F%0F%0F%0F制御文字
1016DLE Data Link Escape%10%10%10%10制御文字
1117DC1 Device Control 1%11%11%11%11制御文字
1218DC2 Device Control 2%12%12%12%12制御文字
1319DC3 Device Control 3%13%13%13%13制御文字
1420DC4 Device Control 4%14%14%14%14制御文字
1521NAK Negative Acknowledge%15%15%15%15制御文字
1622SYN Synchronous Idle%16%16%16%16制御文字
1723ETB End of Transmission Block%17%17%17%17制御文字
1824CAN Cancel%18%18%18%18制御文字
1925EM End of Medium%19%19%19%19制御文字
1A26SUB Substitute%1A%1A%1A%1A制御文字
1B27ESC Escape%1B%1B%1B%1B制御文字
1C28FS File Separator%1C%1C%1C%1C制御文字
1D29GS Group Separator%1D%1D%1D%1D制御文字
1E30RS Record Separator%1E%1E%1E%1E制御文字
1F31US Unit Separator%1F%1F%1F%1F制御文字
2032SP Space%20%20%20+どこでも要変換
2133!%21!!%21小さな区切り
2234"%22%22%22%22どこでも要変換
2335#%23%23#%23大きな区切り
2436$%24%24$%24小さな区切り
2537%%25%25%25%25どこでも要変換
2638&%26%26&%26小さな区切り
2739'%27''%27小さな区切り
2840(%28((%28小さな区切り
2941)%29))%29小さな区切り
2A42*%2A***小さな区切り
2B43+%2B%2B+%2B小さな区切り
2C44,%2C%2C,%2C小さな区切り
2D45-%2D---そのまま書ける
2E46.%2E...そのまま書ける
2F47/%2F%2F/%2F大きな区切り
30480%30000そのまま書ける
31491%31111そのまま書ける
32502%32222そのまま書ける
33513%33333そのまま書ける
34524%34444そのまま書ける
35535%35555そのまま書ける
36546%36666そのまま書ける
37557%37777そのまま書ける
38568%38888そのまま書ける
39579%39999そのまま書ける
3A58:%3A%3A:%3A大きな区切り
3B59;%3B%3B;%3B小さな区切り
3C60<%3C%3C%3C%3Cどこでも要変換
3D61=%3D%3D=%3D小さな区切り
3E62>%3E%3E%3E%3Eどこでも要変換
3F63?%3F%3F?%3F大きな区切り
4064@%40%40@%40大きな区切り
4165A%41AAAそのまま書ける
4266B%42BBBそのまま書ける
4367C%43CCCそのまま書ける
4468D%44DDDそのまま書ける
4569E%45EEEそのまま書ける
4670F%46FFFそのまま書ける
4771G%47GGGそのまま書ける
4872H%48HHHそのまま書ける
4973I%49IIIそのまま書ける
4A74J%4AJJJそのまま書ける
4B75K%4BKKKそのまま書ける
4C76L%4CLLLそのまま書ける
4D77M%4DMMMそのまま書ける
4E78N%4ENNNそのまま書ける
4F79O%4FOOOそのまま書ける
5080P%50PPPそのまま書ける
5181Q%51QQQそのまま書ける
5282R%52RRRそのまま書ける
5383S%53SSSそのまま書ける
5484T%54TTTそのまま書ける
5585U%55UUUそのまま書ける
5686V%56VVVそのまま書ける
5787W%57WWWそのまま書ける
5888X%58XXXそのまま書ける
5989Y%59YYYそのまま書ける
5A90Z%5AZZZそのまま書ける
5B91[%5B%5B%5B%5B大きな区切り
5C92\%5C%5C%5C%5Cどこでも要変換
5D93]%5D%5D%5D%5D大きな区切り
5E94^%5E%5E%5E%5Eどこでも要変換
5F95_%5F___そのまま書ける
6096`%60%60%60%60どこでも要変換
6197a%61aaaそのまま書ける
6298b%62bbbそのまま書ける
6399c%63cccそのまま書ける
64100d%64dddそのまま書ける
65101e%65eeeそのまま書ける
66102f%66fffそのまま書ける
67103g%67gggそのまま書ける
68104h%68hhhそのまま書ける
69105i%69iiiそのまま書ける
6A106j%6Ajjjそのまま書ける
6B107k%6Bkkkそのまま書ける
6C108l%6Clllそのまま書ける
6D109m%6Dmmmそのまま書ける
6E110n%6Ennnそのまま書ける
6F111o%6Foooそのまま書ける
70112p%70pppそのまま書ける
71113q%71qqqそのまま書ける
72114r%72rrrそのまま書ける
73115s%73sssそのまま書ける
74116t%74tttそのまま書ける
75117u%75uuuそのまま書ける
76118v%76vvvそのまま書ける
77119w%77wwwそのまま書ける
78120x%78xxxそのまま書ける
79121y%79yyyそのまま書ける
7A122z%7Azzzそのまま書ける
7B123{%7B%7B%7B%7Bどこでも要変換
7C124|%7C%7C%7C%7Cどこでも要変換
7D125}%7D%7D%7D%7Dどこでも要変換
7E126~%7E~~%7Eそのまま書ける
7F127DEL Delete%7F%7F%7F%7F制御文字

RFC 20(ASCII の規格そのもの)は、脚注で「In the strict sense, DEL is not a control character.(厳密にいえば DEL は制御文字ではない)」と自分で断っています。規格が書いているのはもう1つ、「紙テープの、まちがった文字や要らない文字を消すのに使う」ところまでです。0x7F は2進で 1111111 ── 紙テープなら穴が全部あいた形にあたります。

%XX の英字を大文字にしているのは、RFC 3986 §2.1 が 「URI producers and normalizers should use uppercase hexadecimal digits」 (作る側は16進の英字に大文字を使うべき)と書いているからです。小文字の %e3 も読む側は同じものとして扱いますが、 このページは作る側なので大文字で出します。

やってみる

1問目 / 全5問

「あ」をURLに書ける形にすると、%XX はいくつ並びますか?

よくある質問

URLエンコードとパーセントエンコーディングは同じものですか

ほとんど同じですが、正確には少し違います。パーセントエンコーディングは RFC 3986 が決めている「バイトを %XX の形にする」しくみそのものです。いっぽう「URLエンコード」と呼ぶとき、HTMLのフォームが使う application/x-www-form-urlencoded まで含めていることがよくあります。この2つは半角スペースの扱いが違い、前者では %20、後者では + になります。このページは3つの形を同時に出すので、迷ったら結果の見出しで選んでください。

日本語が %E3%81%82 のように3つ並ぶのはなぜですか

% のうしろの2桁は文字の番号ではなく、バイトの値だからです。UTF-8 という決まりでは、U+0800 から U+FFFF までの文字が3バイトになると RFC 3629 の表で決められています。ひらがな・カタカナ・CJK統合漢字はまるごとこの範囲に入ります。このページはその 21,183 文字を1つずつバイトにして数えていて、3バイト以外だったものは 0 件でした。「あ」は U+3042 で、バイトにすると E3 81 82。それを1バイトずつ %XX にして %E3%81%82 です。

空白が %20 になるときと + になるときがあるのはなぜですか

決まりが2つあって、どちらも正しいからです。URLの道の部分などで使うパーセントエンコーディング(RFC 3986)には + の特別扱いが無く、半角スペースは %20 になります。検索フォームなどが送るときに使う application/x-www-form-urlencoded は、1995年の RFC 1866 が空白を + にすると決めていて、いまの WHATWG URL Standard にもその規則が残っています。注意点が1つあります。戻すときは先に + を空白に直してから %XX をほどく決まりなので、%2B は空白ではなく + そのものに戻ります。

encodeURI と encodeURIComponent はどちらを使えばいいですか

URLを丸ごと渡すときは encodeURI、?q= のうしろに入れる値だけを渡すときは encodeURIComponent です。違いは、変換しない文字がちょうど 11 個ぶん多いか少ないかだけで、その文字は # $ & + , / : ; = ? @ 。どれもURLの区切り記号なので、丸ごと渡すときに化けさせると区画が読めなくなり、値だけ渡すときに残すと値がそこで切れます。0から127までを1文字ずつ通して数えると、そのまま残る文字は encodeURIComponent が71・encodeURI が82で、差はぴったり 11 でした。

%82%A0 を貼ったら「読めません」と出ました

それは Shift_JIS でバイトにされたものを、UTF-8 として読もうとしたためです。%XX はバイトの値でしかないので、どの文字コードでバイトにしたかが分からないと文字に戻せません。%82%A0 は Shift_JIS の「あ」で、UTF-8 の「あ」は %E3%81%82 です。2000年代の日本のサイトのURLには Shift_JIS のものが残っています。この道具は読めなかったときに空欄を返さず、何バイト目でつまずいたかを出して、実際に読めた文字コードとその結果を並べます。どれが読みたかったものかは、こちらでは決めません。

~ や ! が変換されないのは間違いですか

間違いではありませんが、古い決まりの名残です。JavaScript の encodeURIComponent は ! ' ( ) * - . _ ~ を変換せずに残します。これは1998年の RFC 2396 が「mark」としてこの9文字をそのまま使ってよいと決めていたためで、ECMA-262 の本文にも「この予約文字の集合は RFC 2396 にもとづいており、より新しい RFC 3986 の変更を反映していない」という但し書きが付いています。いまの RFC 3986 でそのまま置けるのは英数字と - . _ ~ の66種類だけ。フォームが送る形で残るのは * - . _ の4つだけです。この道具は3つの形を同時に出すので、どこが食い違うかが並べて見えます。

%2520 になってしまいました

2回エンコードが掛かっています。%20(半角スペース)をもう一度エンコードすると、先頭の % が %25 になって %2520 になります。1回ほどけば %20、2回ほどいてやっと空白です。RFC 3986 §2.4 は「実装は同じ文字列を2回以上エンコードしてもデコードしてもならない」と書いていて、データとしての % がエンコードの始まりと読み違えられるからだと理由も添えています。ただし2回ほどくのも危険で、%253F を2回ほどくと ? という区切り記号になってしまいます。この道具は %25 を見つけたら二重の可能性を文字で伝え、1回ほどいた結果と2回ほどいた結果の両方を並べます。勝手に片方を選びません。

ブラウザのアドレス欄では日本語のまま見えるのに、コピーすると %E3 で始まる並びになるのはなぜですか

見せている姿と、送っている姿が違うからです。実際に通信で送られているのは %XX の並びで、URL Standard が決めているのもその送る形のほうです。人が読みにくいので、ブラウザは画面に出すときだけ読める姿に直して見せています。どう見せるかは規格ではなくブラウザごとの工夫なので、ブラウザによって見え方が変わります。なお Google 検索セントラルは、URLに日本語の単語を使うこと自体はすすめたうえで、リンクを書くときは ASCII 以外の文字をパーセントエンコードする必要がある、としています。

貼った文字はどこかに送られますか

送られません。変換はすべてこの画面の中(お使いの機器の中)で行っていて、外の機械に問い合わせることもありません。文字数の上限もありません。同じことをするページの中には、入力をサーバーに送って処理し、1回あたりのバイト数に上限を設けていると自分で書いているものもあります。未公開のURLや社内の検索語をそのまま貼れるかどうかは、そこで変わります。

URLの中にそのまま書ける文字は、英数字62種と - . _ ~ を足した66種類だけです。それ以外は「%」と2桁の数字に 化けます。ASCII 128文字ぶんの早見表と、貼った文字の変換を、 同じ1枚に置きました。日本語1文字が %XX 3つになる理由も、 バイトを並べて見せます。

URLにそのまま書ける文字は、たった66種類しかない

URLの決まりを書いた RFC 3986 は、そのまま置いてよい文字をunreserved(予約されていない文字)として名指ししています ── 英字52・数字10・そして - . _ ~ の4つ、 合わせて66文字だけ。残りは2つに分かれます。

1つは区切りの役を持つ文字で、大きな区切りが # / : ? @ [ ] の7つ、 小さな区切りが ! $ & ' ( ) * + , ; = の11個。もう1つは、どちらの役も無くて居場所が無い11文字 ── 半角スペース " % < > \ ^ ` { | } です。

印字できるASCIIは95文字なので、66+7+11+11=95 でぴったり埋まります。 この足し算は条文の集合の定義から数えたもので、よそから写した数ではありません (単体テストが固定しています)。だから「URLを人に送ったら壊れた」の正体はいつも同じで、66種類の外にある文字が、化けないまま置かれています。

日本語1文字が %XX 3つになるのは、UTF-8が3バイトだから

% のうしろの2桁は文字番号ではなく、バイトの値です。UTF-8はコードポイントの大きさでバイト数を変えていて、 RFC 3629 の表では U+0080〜U+07FF が2バイト、U+0800〜U+FFFF が3バイト(1110xxxx 10xxxxxx 10xxxxxx)、 U+10000以上が4バイトと決まっています。

ひらがな(U+3041〜309F)・カタカナ(U+30A0〜30FF)・CJK統合漢字(U+4E00〜9FFF)は まるごと3バイトの範囲に入ります ── この3つの範囲の21,183文字を全部通して数え、 3バイト以外が0件であることを確かめました。 だから「あ」は U+3042 → E3 81 82 → %E3%81%82。1文字が9文字になります。絵文字はもう一段大きく、🦙(U+1F999)は4バイトで %F0%9F%A6%99 と4つ並びます。 上の道具は 文字ごとに「文字 → 文字番号 → バイト → %表記」の4段を並べて出すので、 なぜ3つなのかを自分で数えて確かめられます。

半角スペースが %20 になるときと + になるときがある

同じ半角スペースなのに、URLの道の部分では %20、 検索フォームが送るときは + になります。どちらかが間違いなのではなく、決まりが2つあるからです。 パーセントエンコーディング(RFC 3986)に + の 特別扱いは無く、空白は %20 になります。いっぽう HTMLのフォームが使う application/x-www-form-urlencoded は、1995年の RFC 1866 が 「space characters are replaced by +(空白は + に置き換える)」と決めていて、 いまの WHATWG URL Standard にも「spaceAsPlus が true なら 0x20 は U+002B (+) に する」という形で残っています。

ここに落とし穴があります。戻すときは、先に + を空白に直してから %XX をほどくのが決まりです(URL Standard のパーサの手順がその順番)。だから %2B はほどいた結果の + であって、空白にはなりません。順番を逆にすると 1%2B2+3 が「1 2 3」になり、足し算が消えます。上の道具は + を空白として読むかどうかを選べて、 どちらで読んだかを画面に出します。

encodeURI と encodeURIComponent の違いは、ちょうど11文字

JavaScriptの2つの関数は、変換しない文字の集合が違うだけです。ECMA-262 の Encode を読むと、どちらも英数字と ! ' ( ) * - . _ ~ を常に残し、encodeURI だけが追加で ;/?:@&=+$,# を残します (仕様の中にこの文字列がそのまま書いてあります)。

0から127までを1文字ずつ通して数えると、そのまま残る文字は encodeURIComponent が71・encodeURI が82で、差は ちょうど11 ── 条文と数が合います。 使い分けもここから決まります。URLを丸ごと渡すなら encodeURI(区切り記号まで 化けさせると壊れる)、?q= のうしろに入れる値なら encodeURIComponent(区切り記号を残すと値がそこで切れる)。

ただし ECMA-262 自身が「この予約文字の集合は RFC 2396 にもとづいており、より新しい RFC 3986 の変更を反映していない」と但し書きを付けています。! ' ( ) * - . _ ~ を残すのは1998年の古い規格の名残で、 いまのフォームの決まりで残るのは * - . _ の4つだけ。 上の早見表を右へ3列たどると、その食い違いが行ごとに見えます。

同じ「あ」でも %E3%81%82 と %82%A0 の2通りがある

%XX はバイトの値でしかないので、どの文字コードでバイトにしたかが決まらないと元の文字に戻せません。 RFC 3986 §2.5 は、新しい方式が文字を扱うときはまず UTF-8 でバイトにしてから %エンコードすべきだと書いていて、 その例としてカタカナの「ア」=%E3%82%A2 を 挙げています(この値も、手で書かずにこの道具に作らせています)。

しかし2000年代の日本のサイトは Shift_JIS でページを作っていたので、そのころのURLでは 同じ「あ」が %82%A0 になっています。EUC-JP なら %A4%A2。だから %82%A0 を UTF-8 として読もうとすると必ず失敗します。この道具は失敗を空欄で返しません。何バイト目が読めなかったかを言い、 実際に読めた文字コードとその結果を並べて、どれが読みたかったかを人に選んでもらいます。

読めてしまうことがあるのが、いちばん怖いところです。EUC-JP の 「あ」(%A4%A2)を Shift_JIS として読むと、 エラーにならずに半角カナ2文字になります。だから「この文字コードです」と 1つだけ名指しはせず、読めたものを全部並べています。 文字化けそのものを読み解きたいときは、文字化け復元の ページのほうが向いています。

? と & と # は区切りの役。文字として書きたいなら化けさせる

URLは記号で区画が分かれています。: と // のうしろが住所、? から先が問い合わせ、& が項目の切れ目、= が名前と値の境目、# から先はページの中の位置です。

だから値の中に & を素で書くと、そこで項目が切れます。 「トム&ジェリー」を検索語にしたつもりが「トム」と「ジェリー」の2項目として送られ、 受け取った側は「ジェリー」を知らない名前として捨ててしまう ── これが実際に起きる壊れ方です。文字として渡したいなら %26 に化けさせます。同じ理由で ? は %3F、# は %23、/ は %2F、= は %3D。そして % 自身は %25 です ── RFC 3986 §2.4 が「% は %エンコードの目印なので、データとして使うには %25 に しなければならない」と明記しています。

上の道具は貼られたURLを区画に割って、どの記号がいま区切りとして働いているかを、色ではなく文字の名札で示します。割るのは「英字ではじまる名前と :」がある文字列だけです。RFC 3986 の付録Bに載っている 正規表現はどんな文字列にも当たってしまうので、それだけで判断すると 「10:30」の「10」までしくみの名前だと言ってしまいます。 §3.1 の決まりを満たさないときは、当てずっぽうで割らずに「URLの形になっていません」と 言います。

2回エンコードすると %2520 になって、戻し方が1通りでなくなる

%20(半角スペース)をもう一度エンコードすると、 先頭の % が %25 に化けて %2520 になります。1回ほどけば %20、2回ほどいてやっと空白。プログラムの受け渡しで 「念のためもう一度」と掛けると、こうして二重になります。

RFC 3986 §2.4 は「実装は同じ文字列を2回以上エンコードしても、デコードしてもならない」 と書き、理由も添えています ── データとしての % が、 %エンコードの始まりと読み違えられるからです。逆に、深く考えずに2回ほどくのも 危険です。%253F を2回ほどくと ? になり、値だったはずのものが区切り記号に変わってしまいます。

だからこの道具は、貼られた文字列に %25 があれば 「二重の可能性があります」と文字で伝え、1回ほどいた結果と2回ほどいた結果を並べます。 勝手に2回ほどいて1つの答えを返すことはしません。

Googleは「ASCII以外の文字はパーセントエンコードを行う必要があります」と書いている

URLに日本語を使ってよいのか、という問いには、検索側の公式な答えがあります。 Google 検索セントラルの「URL構造のベストプラクティス」は、読み手の言語の単語をURLに使うことをすすめたうえで、リンクの href では「予約されていないASCII文字はエンコードされない 形式のまま残る可能性があります。さらに、ASCII以外の文字はパーセントエンコードを行う 必要があります」としています。

同じページに載っている例が 🦙✨ → %F0%9F%A6%99%E2%9C%A8 と gemüse → gem%C3%BCse で、 どちらもこの道具が出す値と一致します(絵文字2つで %XX が7つ ── 🦙 は4バイト、✨ は3バイト)。つまり「日本語のURLを使う」と「%エンコードする」は対立しません ──人が読む姿は日本語のまま、送る姿は %XX の並び、というのが正しい形です。 あわせて Google は、単語の区切りにアンダースコアではなくハイフンを使うようすすめています。_ も - も どちらも66文字の中にあって化けませんが、意味の伝わり方が違います。

文字をURLに置くためではなく、そのまま送れる形にまとめたいときはBase64のページのほうが向いています(あちらにも URLエンコードの変換が付いています)。バイトの値そのものを見たいときはn進数へどうぞ。

出どころ: RFC 3986(新しいタブで開きます)(§2.1 の大文字・§2.2 の区切り・§2.3 の unreserved・§2.4 の %25 と二重禁止・§2.5 の 「ア」の例・§3.1 のスキーム・付録B)、RFC 3629(新しいタブで開きます)(UTF-8のバイト割り当て表)、WHATWG URL Standard(新しいタブで開きます)(§1.3 の percent-encode set と、+ を先に空白へ直す段の順番)、ECMA-262 19.2.6(新しいタブで開きます)(encodeURI の ;/?:@&=+$,# と、RFC 2396 にもとづくという但し書き)、RFC 2396(新しいタブで開きます)(§2.3 の mark)、RFC 1866(新しいタブで開きます)(§8.2.1 の + と %0D%0A)、RFC 20(新しいタブで開きます)(制御文字33個の名前と、DELについての断り)、WHATWG Encoding Standard(新しいタブで開きます)(Shift_JIS の並べ方)、Google 検索セントラル「URL構造のベストプラクティス」(新しいタブで開きます)。 確かめられなかったこと ──【1】同じ題材の道具として 調べようとした tools.studioasari.co.jp の URLエンコードのページは、HTTP 404 で開けませんでした(404のページが返ります)。だからそこを根拠にした記述は1つも書いていません。【2】RFC 3986 の正誤表に、§2.3 の unreserved にバックスラッシュが抜けているのではという指摘 (Errata ID 9147・2026年8月27日報告)が出ていますが、まだ受理されていない(Status: Reported)ので、 この表の66種類は動かしていません。規格が変わったわけではありません。 【3】Shift_JIS の並びを確かめるのに使った WHATWG の索引データそのものは、 転載の条件が付くのでこのサイトには置いていません ── 変換は お使いのブラウザが持っている表から作っています。数(66・7・11・11・33・71・82・66・21,183)は、このページがその場で数えたもので、よそから写した数字は1つもありません。