akios @ ウィキ

3.3. Unicodeエスケープ

最終更新:

akios

- view
管理者のみ編集可

3.1. Unicode

3.2. 字句変換

3.3. Unicodeエスケープ

Javaプログラミング言語のコンパイラー(以下、Javaコンパイラー)は最初に入力中のUnicodeエスケープ(unicode escape)を認識し、\uで始まり4桁の16進数が続くASCII文字列をその16進数に対応するUTF-16符号化コード単位(3.1.)に変換します。これ以外の文字は一切変更しません。補助文字についてはサロゲートペアで表す必要があります。この変換ステップの結果、Unicode入力文字の列となります。

UnicodeInputCharacter:
  UnicodeEscape
  RawInputCharacter

UnicodeEscape:
  \ UnicodeMarker HexDigit HexDigit HexDigit HexDigit

UnicodeMarker:
  u
  UnicodeMarker u

RawInputCharacter:
  any Unicode character

HexDigit: one of
  0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F

\uも16進数も全てASCII文字です。

上記文法処理に加えて入力処理では、未加工入力文字のバックスラッシュ\がUnicodeエスケープの前に他の文字を挟まず何文字連続するか確認します。連続文字数(Unicodeエスケープの分を除いた)が偶数の場合はUnicodeエスケープとして変換され、奇数の場合はUnicodeエスケープは変換されません。

例えば、未加工入力"\\u2297=\u2297"は計11文字"\ \ u 2 2 9 7 = ⊗"になります(\u2297は文字⊗のUnicode符号化です)。

\の後にuがない場合、RawInputCharacterとして扱われ、エスケープ処理されたUnicodeストリームの一部として残ります。

\の後に1文字以上のuが続いた後に4文字の16進数がない場合、コンパイルエラーとなります。

Unicodeエスケープで変換されたキャラクターは以降のUnicodeエスケープの候補からはずされます。

例えば、未加工入力\u005cu005a005cは\のUnicode値であるため\ u 0 0 5 aの計6文字に変換されます。Unicode文字005aである文字Zには変換されません。005cから変換された\は将来のUnicodeエスケープの開始文字とは解釈されません。

Javaプログラミング言語はUnicodeで書かれたプログラムをASCIIベースのツールで処理することができるようにASCIIに変換する標準的な手段を提供しています。変換はASCIIへ変換するプログラムのソーステキスト中のUnicodeエスケープにuを足す処理も含まれています。例えば、\uxxxx\uuxxxxに変換します。一方で同時にソーステキスト中の非ASCII文字は単一のuを用いたUnicodeエスケープに変換します。

この変換されたバージョンはJavaコンパイラーに同様に入力可能で正確に同じプログラムを表しています。後でこのASCII形式は元と全く同じUnicodeソースに戻すことができます。この時、個々のエスケープシーケンスは、複数のuがつくものはuの数が1つ減らされたエスケープシーケンスに変換されるとともに、単一のuのものは対応する単一のUnicode文字に変換されます。

JavaコンパイラーはUnicode文字を出力する際に適切なフォントが利用できない場合、\uxxxx記法を出力形式として使います。

3.4. 行終端子

3.5. 入力要素とトークン

3.6. 空白

3.7. コメント

3.8. 識別子

3.9. キーワード

3.10. リテラル

3.11. 分離子

3.12. 演算子

目安箱バナー