五形式の選択
当ツールの根幹となるのは,「エスケープ(文字→コード)」と「アンエスケープ(コード→文字)」の処理方向を切り替える機能,そしてエスケープ時に選択可能な5つのコードフォーマットの提供です.画面左側のコントロールパネルにある「処理モード」から「エスケープ (文字→コード)」を選択すると,入力されたプレーンテキストを指定したフォーマットのUnicodeエスケープ表現へと変換します.
フォーマットはドロップダウンメニューから以下の5形式を選択できます.1つ目は「\uXXXX (JS/C++/Java)」です.これは文字をUTF-16のコードユニット単位で4桁の16進数として表現する形式です.2つ目は「\u{X...} (ES6)」です.JavaScriptのECMAScript 6以降で導入された形式で,文字のUnicodeコードポイントそのものを中括弧内に16進数で直接指定します.
3つ目は「&#xXXXX; (HTML 16進数)」で,Webページ上に文字を表示させる際に使用されるHTML数値文字参照を16進数で記述する形式です.4つ目は「&#DDDDD; (HTML 10進数)」であり,同様のHTML数値文字参照を10進数の数値で表現します.
5つ目は「%uXXXX (レガシーURL)」です.これはかつてJavaScriptの組み込み関数であったescape()などで用いられていたパーセント表記の形式であり,現在の標準的なパーセントエンコーディングとは異なります.
利用者が入力テキストエリアに文章を打ち込むと,これらの選択されたフォーマットに基づいてプログラムが文字列を一文字ずつ走査し,リアルタイムで右側の出力エリアに結果をレンダリングします.画面の更新にはサーバーへの通信を一切伴わず,すべてブラウザのメモリ内でJavaScriptによって同期的に実行されます.
日本語とASCII
本ツールには,日本語などの非ASCII文字と,英数字や半角記号といったASCII文字とをどのように区別してエスケープするかを制御するための「ASCII文字もエスケープ」スイッチが用意されています.
Unicodeの仕様において,コードポイントが128未満(10進数で0から127)の文字はASCII文字として分類されます.初期状態ではこのスイッチはオフになっており,テキスト内に半角のアルファベットや数字が含まれていても,それらは変換されずにそのまま出力されます.
これにより,日本語部分のみをエスケープし,ASCII部分をそのまま残してコード表記を比較するといった利用が可能になります.一方,このスイッチをオンにすると,コードポイントの判定を問わず,入力されたすべての文字が選択中のフォーマットに従ってエスケープされます.
さらに,「英字部を大文字に」というスイッチも実装されています.エスケープコード内の16進数表現(aからf)を大文字(AからF)で出力するかどうかを切り替えるための機能です.例えば,「あ」という文字を\uXXXX形式でエスケープした場合,スイッチがオフなら「\u3042」となりますが,スイッチをオンにすると,アルファベット部分が大文字化されて出力されます.
なお,この「英字部を大文字に」スイッチは,フォーマットとして「&#DDDDD; (HTML 10進数)」を選択している場合にはコントロールパネルから非表示になります.これは,10進数表記にはアルファベットが含まれないため,大文字化の処理自体が無意味となるためです.
UIの連動ロジックにより,無効な設定項目を隠すことで直感的な操作を提供しています.
絵文字とsurrogate
絵文字や基本多言語面を超える文字(例えば追加漢字面など)をエスケープする際,文字コードの仕様に基づいた適切な変換が求められます.本ツールでは,これらの文字を正確に処理するために,サロゲートペアとコードポイントの抽出ロジックを実装しています.
JavaScriptの内部では,文字列はUTF-16のコードユニットの配列として管理されています.本ツールは入力された文字列をイテレータで走査し,文字のUnicodeコードポイントをcodePointAtメソッドで取得します.同時に,その文字がUTF-16上でいくつのコードユニットから構成されているかを調べ,各ユニットをcharCodeAtメソッドで抽出します.
たとえば,サンプルのテキストにも含まれている絵文字「😊」を入力した場合を考えます.この絵文字のコードポイントはU+1F60Aです.しかしUTF-16では,この1つの文字を表現するために上位サロゲート(0xD83D)と下位サロゲート(0xDE0A)の2つのコードユニットの組み合わせ(サロゲートペア)が用いられます.
ここでエスケープフォーマットとして「\uXXXX」や「%uXXXX」を選択した場合,ツールは抽出されたコードユニットごとに変換を行うため,「\uD83D\uDE0A」や「%uD83D%uDE0A」というように2つのエスケープシーケンスに分割されて出力されます.
一方,「\u{X...}」やHTML数値文字参照の形式を選択した場合,ツールはサロゲートペアではなく,文字本来のコードポイントである1F60Aを基準にして変換処理を行います.その結果,「\u{1F60A}」や「😊」のように,単一のコードとしてまとまった形で出力されます.
本ツールでは結合文字や異体字セレクタに対して独自の高度な形態素解析を行うのではなく,JavaScriptの標準的な文字列走査機能とUTF-16の仕様に忠実に則って,コードポイントおよびコードユニットへの分解とエスケープを行っています.
混在表記の一回復元
コードから文字への復元を行う「アンエスケープ」モードでは,複数の異なるエスケープ形式が混在しているテキストであっても,一回の処理で元のプレーンテキストへと復元する機能を提供しています.
この処理の核となるのは,ツール内部で定義されている単一の正規表現です.具体的には,\u{XXXX},\uXXXX,&#xXXXX;,&#DDDDD;,および %uXXXX の5つのフォーマットすべてに同時に合致するパターンが組まれています.利用者が入力テキストエリアにエスケープ済みのコードをペーストすると,この正規表現がテキスト全体を走査します.
パターンに一致した箇所が見つかるたびに,その部分文字列が16進数または10進数の数値としてparseInt関数によって解析されます.そして,4桁のコードユニットやパーセント形式の場合はfromCharCodeによって,中括弧形式やHTML文字参照の場合はfromCodePointによって,対応するUnicode文字へと変換されます.
このアンエスケープ処理において重要な仕様として,置換処理は「抽出された各マッチに対して一回ずつ」しか実行されないという点が挙げられます.すなわち,再帰的なデコード処理は行われません.例えば,復元された結果の文字自体が,別のエスケープシーケンスを構成するような文字列であったとしても,それが再びパースされて変換されることはありません.
これにより,入力されたテキストの中に偶然エスケープ形式に似た文字列が含まれていた場合の過剰な置換や,意図しない二重デコードを防ぎ,各一致箇所を一回だけ置換します.
不正値と未一致の扱い
文字コードのエンコードおよびアンエスケープ(復元)処理の双方において,入力長には100,000 UTF-16コードユニットの上限が設定されています.この制限を超過した場合はインラインでエラーが表示され,途中の部分的な出力を行わずに処理を中断します.これは過剰な処理を抑制するための境界であり,ブラウザの実行時間やメモリ使用量を全面的に保証するものではありません.
また,入力されたコードが必ずしも正当なUnicode範囲内に収まっているとは限らないため,本ツールでは不正な数値や不整合なエスケープ形式に対する振る舞いを厳格に定義しています.
Unicodeの規格では,表現できるコードポイントの最大値はU+10FFFFと定められています.利用者が\u{110000}や�などの規格範囲を超える数値を入力した場合,ツールの変換ロジックは即座にこれを検知し,例外を捕捉してエラーを表示します.
また,HTML数値文字参照のエンコードおよびデコードにおいては,ブラウザの代替文字置換規則を模倣するのではなく限定的な仕様として,NUL文字(0),サロゲートコードポイント(D800〜DFFF),およびすべてのC1制御文字(80〜9F)を明示的に拒否してエラーとします.
エラーが発生すると,それまでに出力されていた古い変換結果は直ちに消去されて出力テキストエリアが空になり,テキストエリアの下部にエラーメッセージが表示される仕様となっています.これにより,利用者は入力データに致命的な誤りがあることを視覚的に把握できます.
一方で,エスケープ形式の正規表現パターンに完全に一致しない単なる文字列や,構文として不完全な表記(例えば,4桁に満たない \u12 や,セミコロンが欠落した あ など)については,エラーを引き起こすことはありません.これらの未一致表記は,変換対象とはみなされず,元の入力テキストのままの状態で出力結果に残されます.
この仕様により,エスケープコードと通常のプレーンテキストが混在した文章の中から,正しい形式のコードだけを抽出して復元することが可能となっています.
コピーとHTML・JSON・URLとの違い
本ツールは入力や出力の利便性を高めるためのUI操作を備えるとともに,他の専門的なデータフォーマット変換処理との明確な機能の境界を持っています.
画面には,エスケープとアンエスケープの処理方向を瞬時に入れ替える「処理方向を入れ替える」ボタンや,入力と出力の両方を一度に初期化する「クリア」ボタン,具体的な動作を確認できる「サンプルを読み込む」ボタンが配置されています.変換結果の「コピー」操作は非同期クリップボードAPIの完了を待機して成否を確認し,成功時にコピー完了通知を表示し,権限拒否などの失敗時にはエラーを通知します.
機能の境界として注意すべき点は,本ツールがあくまで「文字のUnicodeコード表現への単純な置換」のみを行うツールであることです.たとえば,HTML数値文字参照を扱うことはできますが,HTMLパーサーが備えているような不正な数値の自動補正機能や,名前付けられた文字実体参照(&など)の処理,特定のタグの無害化は行いません.
また,JSON形式のデータを作成する際,本ツールで文字のエスケープ自体は可能ですが,JSONの仕様において必須となる文字列全体をダブルクォーテーションで囲む引用処理や,バックスラッシュ記号自身の二重エスケープ化などは実行しません.
さらに,「%uXXXX」形式は過去のブラウザで使われていたレガシーなescape()関数の形式であり,現在Web標準として利用されているUTF-8ベースのパーセントエンコーディング(URIエンコード)とは異なります.標準的なURLエンコード処理や完全なJSONのパース・整形が必要な場合には,それぞれの用途に特化した専用ツールを使用する必要があります.
ユーザー入力の変換処理自体はブラウザ内でeval()を実行せずにローカルで処理されますが,サイト共通の静的アセット配信やアクセス計測,広告配信に伴う通常のネットワーク通信とは区別されます.なお,入力と出力の方向入替ボタンは有効な非空の変換結果が存在する場合のみ操作可能であり,エスケープによって展開されたテキストが入力上限の100,000コードユニットを超過した場合,そのまま一括して逆方向に復元することはできません.