「3.3. Unicodeエスケープ」の編集履歴(バックアップ)一覧に戻る

3.3. Unicodeエスケープ - (2012/09/04 (火) 13:08:26) のソース

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

#divstyle(background-color:#f0f0f0;border:1px solid red;padding 4px){

&i(){UnicodeInputCharacter}:
  &i(){UnicodeEscape}
  &i(){RawInputCharacter}

&i(){UnicodeEscape}:
  &tt(){\} &i(){UnicodeMarker} &i(){HexDigit} &i(){HexDigit} &i(){HexDigit} &i(){HexDigit}

&i(){UnicodeMarker}:
  &tt(){u}
  &i(){UnicodeMarker} &tt(){u}

&i(){RawInputCharacter}:
  any Unicode character

&i(){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

}

&i(){&small(){&tt(){\}も&tt(){u}も16進数も全てASCII文字です。}}

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

#divstyle(background-color:#f0f0ff;border:1px solid black;padding 4px){

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

}

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

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

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

#divstyle(background-color:#f0f0ff;border:1px solid black;padding 4px){

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

}

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

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

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

**[[3.4. 行終端子]]
**[[3.5. 入力要素とトークン]]
**[[3.6. 空白]]
**[[3.7. コメント]]
**[[3.8. 識別子]]
**[[3.9. キーワード]]
**[[3.10. リテラル]]
**[[3.11. 分離子]]
**[[3.12. 演算子]]
目安箱バナー