Unicodeエスケープ変換ツール

テキストと\u0041形式のUnicodeエスケープを相互変換

Unicodeエスケープ変換ツール

テキスト\u エスケープ
入力
結果

Unicodeエスケープ変換ツールについて

エンコード方向では、各文字をUTF-16のコードユニット単位で\uXXXXに変換します。基本多言語面(BMP)の外にある文字、つまり絵文字や𠮷のような拡張漢字はサロゲートペア2つに分かれ、😀は\ud83d\ude00の12文字になります。デコード方向は\uXXXX、\u{1F600}、Pythonの\U0001F600、\xXXの4形式を認識し、それ以外はそのまま残します。

JSON、JavaScript、Java、C#のエスケープは見た目が同じなので使い回したくなりますが、言語ごとに使える形式と解釈されるタイミングが違います。

😀が\uD83D\uDE00になる計算

\uの後ろは16進4桁だけなので、直接書けるのはU+FFFFまでです。それより上はUTF-16の方式で2つに割ります。U+1F600から0x10000を引くと0xF600。この20ビット値の上位10ビット(0x3D)を0xD800に足すと上位サロゲートD83D、下位10ビット(0x200)を0xDC00に足すと下位サロゲートDE00です。𠮷(U+20BB7)なら\ud842\udfb7になります。

D800〜DFFFはこの用途専用に空けてある領域で、文字は割り当てられていません。\uD83Dだけが単独で残った文字列は壊れた状態(孤立サロゲート)で、UTF-8に書き出すとU+FFFD(�)に化けるかエラーになります。このツールのデコーダは孤立サロゲートができると結果の下に個数付きで警告を出すので、入力がペアの途中で切れていないか確認してください。

同じ絵文字の書き方6種

このツールが読めるのは最初の3つ(Pythonは\U形式のみ)と\xXXです。\N{名前}形式はUnicodeの名前表全体が必要なため対応せず、元のまま残します。

  • JSON、Java、C#、ES5までのJavaScript:\uD83D\uDE00(サロゲートペア必須)
  • JavaScript(ES2015以降):\u{1F600} — JSONでは不可
  • Python 3:\U0001F600(大文字Uと8桁)または\N{GRINNING FACE}
  • CSS:\1F600(終わりを示すため後ろに空白1つ)
  • HTML:😀 または 😀
  • URL:%F0%9F%98%80(UTF-8バイトをパーセントエンコード)

\xe3\x81\x82を入れても「あ」にならない

Pythonで'あ'.encode()を表示するとb'\xe3\x81\x82'、UTF-8の3バイトです。ところがJavaScriptの\xXXはバイトではなく、U+0000〜00FFの文字1つを意味します。このツールも既定ではJavaScriptに従うので、デコードするとã+見えない制御文字2つになります。デコード方向で「連続する \x を UTF-8 バイトとして読む」をオンにすると、続いた\xをバイト列としてまとめUTF-8で読むので「あ」になります。UTF-8として不正なバイトはU+FFFDになります。UTF-8をLatin-1として読んだとき、日本語がãやæで始まる記号列に化けるのも同じ仕組みです。

Javaのコメント内の\u000aがコンパイルを壊す

Javaは\uXXXXを文字列リテラル内だけでなく、字句解析の前にソースファイル全体で先に変換します(Java言語仕様3.3節)。//コメントに\u000aと書くと本物の改行になり、その後ろがコードとして読まれます。文字列には\nを使ってください。JavaScriptとJSONは文字列リテラル内でしか解釈しないので、この問題はありません。

今でもエスケープする理由

Java 9より前の.propertiesファイルはISO-8859-1で読まれたため、日本語をnative2asciiで\uXXXXにするのが定番でした。現在もログやコードレビューで見えない文字(\u00a0、\u200b、全角スペース\u3000)や紛らわしい文字を区別したいときに役立ちます。「英数字・記号はそのまま保持」をオンにすると、印字可能なASCII(0x20〜0x7E)以外はすべて変換されるので、改行とタブも\u000a、\u0009になります。

例

かな・漢字・絵文字をまとめて

入力
あ𠮷😀
結果
\u3042\ud842\udfb7\ud83d\ude00

「あ」はBMP内で1つ、𠮷と😀はサロゲートペアで2つずつ。JSON文字列にそのまま使えます。

ES2015形式のデコード

入力
\u{1F600} \u{3042}
結果
😀 あ

波括弧内は1〜6桁。U+10FFFFを超える値は元のまま残ります。

バイトエスケープの誤解

入力
\xe3\x81\x82
結果
既定: ã + U+0081 + U+0082 / UTF-8バイトオプション: あ

\xは既定ではLatin-1範囲の1文字です。PythonのbytesのようにUTF-8バイトならオプションをオンにします。

使い方

  1. テキストまたはエスケープ文字列を入力します。
  2. エンコードかデコードを選びます。
  3. 必要に応じてASCII保持・大文字(エンコード)、\xをUTF-8バイトとして読む(デコード)オプションを切り替えます。
  4. 結果をコピーします。

よくある質問

絵文字が\uの2つ組になるのはなぜ?

U+FFFFを超える文字はUTF-16でサロゲートペア2つになり、\uXXXXは1コードユニットしか表せないからです。

JSONで\u{1F600}は使えますか?

使えません。RFC 8259は\u+4桁のみで、BMP外の文字はサロゲートペア12文字で書くか、UTF-8のまま入れます。

Pythonの\U0001F600は戻せますか?

はい。大文字Uと8桁の形式を読みます。\N{GRINNING FACE}のような名前形式は対応しておらず、元のまま残ります。

デコード後に絵文字が四角になります。

ペアの片方だけが入力に含まれた孤立サロゲートの可能性が高いです。その場合は警告が表示されます。

関連ガイド

出典

基準日:

プライバシーとデータの扱い