Unicode エスケープのガイド:ASCII しか通らない経路を越える
エスケープの目的は、UTF-8 を保証しない経路を通すことです。経路が信頼できるなら、変換は読みにくくするだけです。
\uXXXX が必要になる場面
古い Java の properties は ISO-8859-1 として読まれるため、中国語は \u4e2d と書く必要があります。ビルドスクリプト、テンプレートエンジン、ログ経路が ASCII しか保証しないこともあります。
文字コードの切り分けにも役立ちます。同じ文が2つの環境で違って見えるとき、両方をエスケープすれば、文字自体が違うのか描画だけが違うのかを確認できます。ASCII が読めるままなので比較しやすいです。
- Java の properties と古いビルドスクリプト
- ASCII しか保証しないログや転送経路
- 見た目が同じで異なる文字の発見
規則と2つの落とし穴
変換されるのは非 ASCII だけで、ASCII はそのままなのでコードの構造は読めます。各文字はバックスラッシュと u、16進数4桁で表します。文字単位の変換であり、バイト単位の16進数エンコードとは別物です。
落とし穴の1つ目は、U+FFFF を超える文字です。多くの絵文字が該当し、サロゲートペアが必要ですが、このツールは5桁の形式を出力します。復号側は4桁しか読まないため、往復で別の文字と余分な0が残ります。
- バックスラッシュ u の後は16進数4桁、基本多言語面のみ
- 絵文字などは往復で壊れる
- すでにエスケープ済みの文字列を重ねて変換しない
境界:解決するのは転送であって機密ではない
鍵はありません。エスケープを見た人は誰でも戻せるので、暗号ではなく、機密情報を隠す用途にも使えません。サイズも増えます。中国語1文字が6文字になるため、長い文書では差が目立ちます。
現代のシステムはほとんどが端末まで UTF-8 です。データベース、HTTP ヘッダ、ページが文字コードを宣言していれば、手作業のエスケープは通常不要です。UTF-8 を扱えない箇所を確認できたときだけ、この層を足してください。
- 鍵がなく、暗号ではない
- 中国語1文字が6文字に増える
- UTF-8 の経路では通常不要
よくある質問
絵文字が壊れるのはなぜですか
符号位置をそのまま出力し、4桁に制限していないため、絵文字は5桁の形式になります。復号側は4桁しか読まないので別の文字になります。絵文字には Base64 か URL エンコードを使ってください。
URL エンコードとの違いは何ですか
URL エンコードはバイト単位でパーセント表記にし、主に URL 用です。Unicode エスケープは文字単位で書き、主にソースや設定ファイル用です。同じ漢字でも結果は全く異なります。
エスケープした文字列はプログラムで読めますか
対応した処理系なら読めます。Java、JavaScript、JSON は解釈します。ただしテキストエディタは自動で戻さないため、人間にはバックスラッシュと英数字に見えます。
関連ツール:Unicodeエスケープエンコーダー