%E3%81%82・\u3042・\343の読み方|URL・JSON・gitで日本語が符号になる理由
URLをコピーしたら「%E6%96%87%E5%AD%97」、APIの返り値を見たら「\u6587\u5b57」、gitのファイル名が「\346\226\207」。どれも文字化けに見えますが、日本語が壊れたのではなく、日本語のバイトや番号を英数字で書き表した「符号」のまま見えている状態です。この記事では、よく見る9種類の書き方の見分け方と読み方、どこで出てくるのか、表示を日本語にする設定をまとめます。
符号は文字化けではなく「日本語の書き方の一つ」
文字化けは、文字コードを取り違えて別の文字として読んでしまった状態です。一方、%E3%81%82や\u3042は、英数字しか使えない場所に日本語を書くために、わざと英数字に置き換えたものです。書き方の決まりが分かれば、1文字も欠けずに日本語に戻せます。
大きく分けると、「文字の番号(Unicodeのコードポイント)」を書く方式と、「文字のバイト(UTF-8などで保存したときの数字)」を書く方式があります。「あ」はUnicodeの番号がU+3042(10進数で12354)、UTF-8のバイトがE3 81 82です。この2つの数字を覚えておくと、どの書き方なのかがすぐ分かります。
9種類の書き方の早見表
| 書き方 | 例(「文字」など) | 中身 | よく出る場所 |
|---|---|---|---|
| URLエンコード | %E6%96%87%E5%AD%97 | UTF-8のバイト | URL・検索ワード・ダウンロードしたファイル名 |
| URLエンコード(古い形) | %95%B6%8E%9A | Shift_JISのバイト | 古い日本のサイト・掲示板のURL |
| Unicodeエスケープ | \u6587\u5b57 | Unicodeの番号(16進) | JSON・JavaScript・APIの返り値 |
| 8進数のエスケープ | \346\226\207\345\255\227 | UTF-8のバイト(8進) | git status・git diffのファイル名 |
| バイトのエスケープ | \xe6\x96\x87\xe5\xad\x97 | UTF-8のバイト(16進) | Pythonのbytes・ログ・エラーメッセージ |
| HTMLの文字参照 | 文字 / 文字 | Unicodeの番号(10進・16進) | HTMLのソース・RSS・メールのHTML |
| Quoted-Printable | =E6=96=87=E5=AD=97 | UTF-8のバイト | メールの本文のソース |
| Punycode | xn--wgv71a119e.jp | 日本語ドメインを変換したもの | 日本語ドメインのURL(日本語.jp) |
| Base64 | 5paH5a2X5YyW44GR | UTF-8のバイトを64種類の文字で表したもの | メールの添付・本文・APIのデータ |
表の例は、文字化け 復元・解読ツールの「符号を読む」に入れて確かめたものです。Base64の例は「文字化け」、それ以外は「文字」(Punycodeは「日本語.jp」)に戻ります。文章の中に複数の書き方が交じっていても、それぞれ見つけて読みます。
URLの%E3%81%82:日本語のURLをコピーしたとき
URLには英数字と一部の記号しか使えないので、日本語はUTF-8のバイトを「%」と16進数2桁で書き表します。日本語1文字はUTF-8で3バイトなので、%XXが3つで1文字です。「文字化け」は「%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91」と、4文字で36文字になります。
- ブラウザのアドレス欄では日本語で表示されていても、コピーしてチャットやメールに貼ると%XXの形になる
- %E3で始まるものはひらがな・カタカナ、%E4〜%E9で始まるものは漢字であることが多い
- %82や%83が多く、%XXが2つで1文字に見えるものは、Shift_JISで書かれた古いURLの可能性がある
- 「+」は空白を表すことがある(検索フォームから送られたURLなど)
URLを人に送るときは、%XXの形のままのほうが確実です。日本語に戻したURLは、送る先のアプリによってはリンクが途中で切れることがあります。
JSONの\u3042、gitの\343、Pythonの\xe3
プログラムの世界では、日本語をそのまま出さずに書き表すことがよくあります。それぞれ表示の設定で日本語にできます。
- JSONの\u3042:Unicodeの番号を4桁の16進数で書いたもの。PythonのJSON出力はensure_ascii=Falseを付けると日本語のまま出せる。絵文字は「🍣」(🍣)のように2つ組で書かれる
- gitの\343\201\202:git statusなどで日本語のファイル名が8進数で表示されたもの。git config --global core.quotepath false を設定すると日本語で表示される
- Pythonの\xe3\x81\x82:bytes型をそのまま表示したもの。.decode('utf-8') で文字列にすれば日本語になる
- HTMLのあ・あ:Unicodeの番号を10進数か16進数で書いたもの。ブラウザでは「あ」と表示されるが、ソースやRSSをテキストで見ると符号のまま見える
xn--で始まるドメインは日本語ドメイン
「日本語.jp」のような日本語ドメインは、DNSの仕組み上、英数字に変換して扱われます。この変換方式がPunycodeで、変換したものには「xn--」が付きます。「xn--wgv71a119e.jp」は「日本語.jp」です。
ブラウザは、見た目のよく似た文字を使ったなりすましを防ぐために、日本語ドメインをあえてxn--の形で表示することがあります。知らないxn--のドメインからのメールやリンクは、日本語に戻して、本当にそのドメインで合っているかを確かめると安心です。
符号ではなく「縺」「ã」のような本当の文字化けが交じっているときは、文字化けのパターン早見表で化け方を確かめてください。メールの件名の=?UTF-8?B?…?=もこの仲間で、メールの件名・本文の文字化けで詳しく説明しています。
よくある質問
- URLの%E3%81%82を日本語に戻すには?
- %のあとの16進数2桁を1バイトとして集め、UTF-8として読みます。%E3%81%82は「あ」です。日本語は%XXが3つで1文字になります。文字化け 復元・解読ツールの「符号を読む」に貼り付ければまとめて戻せます。
- JSONの\u3042は何ですか?
- Unicodeの番号を16進数4桁で書いたUnicodeエスケープで、\u3042は「あ」です。JSONでは日本語をこの形で出力する設定がよく使われます。絵文字は🍣のように2つ組で1文字を表します。
- gitで日本語のファイル名が\343\201\202のように表示されます。
- gitが日本語のファイル名のUTF-8のバイトを8進数で表示しています。git config --global core.quotepath false を設定すると、git statusなどで日本語のまま表示されます。
- xn--で始まるURLは危険ですか?
- xn--は日本語などの国際化ドメインを英数字に変換したしるしで、それだけで危険というわけではありません。ただし見た目の似た文字を使ったなりすましにも使われるので、日本語に戻してドメイン名を確かめると安心です。
この記事で紹介したツール
あわせて読みたい
CSVがExcelで文字化けするときの直し方|UTF-8(BOM付き)とShift_JISの使い分け
Webサービスからダウンロードした CSV をダブルクリックで Excel で開いたら、「豌丞錐,菴乗園」のように文字化けしていた。これは CSV の中身が壊れているのではなく、Excel が文字コードを取り違えて読んだだけです。この記事では、化ける理由、いま開いている CSV を読める形で開く方法、次から化けない保存の仕方(UTF-8 BOM付き・Shift_JIS)、変換するときに消える文字の注意点をまとめます。
記事を読む →「�」「?」の文字化けは戻せる?|欠けた文字の復元と、戻せない文字化けの見分け方
文字化けした文に「�」(黒いひし形に?)が交じっていると、もう戻せないと思いがちです。実は「�」の所で失われたのは多くの場合1バイトだけで、文字コードの決まりと前後の文脈から、元の文字をかなりの確率で推測できます。一方、「?」や「・」に置き換わって保存されたもの、「�」ばかりの文字化けは戻せません。この記事では、「�」が出る理由と推測で補える仕組み、戻せる・戻せないの見分け方、文字化けを悪化させない注意点をまとめます。
記事を読む →メールの件名が文字化けする原因と直し方|=?UTF-8?B?・=?ISO-2022-JP?B?・$Bの読み方
受け取ったメールの件名が「=?UTF-8?B?5paH5a2X…?=」のような英数字になっていたり、本文が「$BL@F|$N…(B」になっていたりすることがあります。これはメールで日本語を送るための決まった書き方が、そのまま見えている状態です。この記事では、件名の=?…?=の仕組み、B方式とQ方式の違い、JISメールの$B、本文の文字化けの原因と、送る側でできる対策をまとめます。
記事を読む →