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
RawInputCharacter
UnicodeEscape:
\ UnicodeMarker HexDigit HexDigit HexDigit HexDigit
\ UnicodeMarker HexDigit HexDigit HexDigit HexDigit
UnicodeMarker:
u
UnicodeMarker u
u
UnicodeMarker u
RawInputCharacter:
any Unicode character
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
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エスケープの候補からはずされます。
例えば、未加工入力\u005cu005aは005cは\の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記法を出力形式として使います。