一部のコンパイラは、JavaDoc およびソース コード コメントの非 ASCII 文字で失敗しました。
これは、コンパイラが入力が UTF-8 であると想定し、ソース ファイルに無効な UTF-8 シーケンスがあるためと考えられます。これらがソース コード エディターのコメントにあるように見えることは、レクサー (コメントを他のトークンから区別する) が実行されないため、無関係です。このエラーは、ツールがレクサーの実行前にバイトを文字に変換しようとしているときに発生します。
and sayのman
ページjavac
javadoc
-encoding name
Specifies the source file encoding name, such as
EUCJIS/SJIS. If this option is not specified, the plat-
form default converter is used.
javadoc
エンコーディングフラグで実行されている
javadoc -encoding <encoding-name> ...
ソースファイルに使用したエンコーディングに置き換えた後<encoding-name>
、正しいエンコーディングが使用されるようになります。
一緒にコンパイルする必要があるソース ファイルのグループ内で複数のエンコーディングが使用されている場合は、最初にそれを修正し、すべてのソース ファイルに対して 1 つの統一されたエンコーディングに落ち着く必要があります。UTF-8 を使用するか、ASCII に固執する必要があります。
Java ソースファイルの Unicode に関する現在 (Java 7) および将来 (Java 8 以降) のプラクティスは何ですか?
Javaでソースファイルを扱うアルゴリズムは
- バイトを集める
- エンコーディングを使用してバイトを文字 (UTF-16 コード単位) に変換します。
- 4 つの 16 進数が続くすべてのシーケンスを
'\\'
'u'
、それらの 16 進数に対応するコード単位に置き換えます。"\u"
4 桁の 16 進数が続かない場合はエラーになります。
- 文字をトークンに Lex します。
- トークンをクラスに解析します。
現在および以前の慣例では、バイトを UTF-16 コード単位に変換するステップ 2 は、コンパイル単位 (ソース ファイル) をロードするツール次第ですが、コマンド ライン インターフェイスのデファクト スタンダードは-encoding
フラグを使用することです。
\uABCD
その変換が行われた後、言語は、字句解析と解析の前に、スタイル シーケンスを UTF-16 コード単位に変換することを義務付けます (ステップ 3)。
例えば:
int a;
\u0061 = 42;
Java ステートメントの有効なペアです。すべての Java ソース コード ツールは、バイトを char に変換した後、解析する前に \uABCD シーケンスを探して変換する必要があるため、このコードは次のように変換されます。
int a;
a = 42;
解析前。これは、\uABCD シーケンスが発生する場所に関係なく発生します。
このプロセスは次のようになります
- 取得バイト:
[105, 110, 116, 32, 97, 59, 10, 92, 117, 48, 48, 54, 49, 32, 61, 32, 52, 50, 59]
- バイトを文字に変換します。
['i', 'n', 't', ' ', 'a', ';', '\n', '\\', 'u', '0', '0', '6', '1', ' ', '=', ' ', '4', '2', ';']
- Unicode エスケープを置き換えます。
['i', 'n', 't', ' ', 'a', ';', '\n', a, ' ', '=', ' ', '4', '2', ';']
- レックス:
["int", "a", ";", "a", "=", "42", ";"]
- 解析:
(Block (Variable (Type int) (Identifier "a")) (Assign (Reference "a") (Int 42)))
すべての非 ASCII 文字は、JavaDoc で HTML の &escape; のようなコードでエスケープする必要がありますか?
'<'
ドキュメントに文字どおりに表示したいHTML 特殊文字以外は必要ありません。\uABCD
javadoc コメント内でシーケンスを使用できます。ソース ファイルを解析する前にJava プロセスを実行\u....
して、文字列、コメント、実際のどこにでも表示できるようにします。それが理由です
System.out.println("Hello, world!\u0022);
有効な Java ステートメントです。
/** @return \u03b8 in radians */
と同等です
/** @return θ in radians */
javadocに関する限り。
しかし、Java//
コメントに相当するものは何でしょうか?
Java ではコメントを使用できます//
が、Javadoc はドキュメントのコメント内のみを検索/**...*/
します。 //
コメントにはメタデータが含まれていません。
Java の\uABCD
シーケンス処理の影響の 1 つは、
// Comment text.\u000A System.out.println("Not really comment text");
1 行のコメントのように見え、多くの IDE ではそのように強調表示されますが、そうではありません。