16

一部のコンパイラは、JavaDocおよびソースコードコメントの非ASCII文字で失敗しました。JavaソースファイルのUnicodeに関して、現在(Java 7)および将来(Java 8以降)のプラクティスは何ですか?IcedTea、OpenJDK、およびその他のJava環境には違いがありますか?また、言語仕様は何によって決まりますか?すべての非ASCII文字をHTML &escape;を使用してJavaDocでエスケープする必要があります。-コードのように?しかし、Javaの//コメントに相当するものは何でしょうか?

更新:コメントは、任意の文字セットを使用できること、およびコンパイル時にソースファイルで使用されている文字セットを示す必要があることを示しています。これを調べ、Ant、Eclipse、およびMavenを介してこれを構成する方法の詳細を探します。

4

2 に答える 2

14

一部のコンパイラは、JavaDoc およびソース コード コメントの非 ASCII 文字で失敗しました。

これは、コンパイラが入力が UTF-8 であると想定し、ソース ファイルに無効な UTF-8 シーケンスがあるためと考えられます。これらがソース コード エディターのコメントにあるように見えることは、レクサー (コメントを他のトークンから区別する) が実行されないため、無関係です。このエラーは、ツールがレクサーの実行前にバイトを文字に変換しようとしているときに発生します。


and sayのmanページjavacjavadoc

-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でソースファイルを扱うアルゴリズムは

  1. バイトを集める
  2. エンコーディングを使用してバイトを文字 (UTF-16 コード単位) に変換します。
  3. 4 つの 16 進数が続くすべてのシーケンスを'\\' 'u'、それらの 16 進数に対応するコード単位に置き換えます。"\u"4 桁の 16 進数が続かない場合はエラーになります。
  4. 文字をトークンに Lex します。
  5. トークンをクラスに解析します。

現在および以前の慣例では、バイトを UTF-16 コード単位に変換するステップ 2 は、コンパイル単位 (ソース ファイル) をロードするツール次第ですが、コマンド ライン インターフェイスのデファクト スタンダードは-encodingフラグを使用することです。

\uABCDその変換が行われた後、言語は、字句解析と解析の前に、スタイル シーケンスを UTF-16 コード単位に変換することを義務付けます (ステップ 3)。

例えば:

int a;
\u0061 = 42;

Java ステートメントの有効なペアです。すべての Java ソース コード ツールは、バイトを char に変換した後、解析する前に \uABCD シーケンスを探して変換する必要があるため、このコードは次のように変換されます。

int a;
a = 42;

解析前。これは、\uABCD シーケンスが発生する場所に関係なく発生します。

このプロセスは次のようになります

  1. 取得バイト:[105, 110, 116, 32, 97, 59, 10, 92, 117, 48, 48, 54, 49, 32, 61, 32, 52, 50, 59]
  2. バイトを文字に変換します。['i', 'n', 't', ' ', 'a', ';', '\n', '\\', 'u', '0', '0', '6', '1', ' ', '=', ' ', '4', '2', ';']
  3. Unicode エスケープを置き換えます。['i', 'n', 't', ' ', 'a', ';', '\n', a, ' ', '=', ' ', '4', '2', ';']
  4. レックス:["int", "a", ";", "a", "=", "42", ";"]
  5. 解析:(Block (Variable (Type int) (Identifier "a")) (Assign (Reference "a") (Int 42)))

すべての非 ASCII 文字は、JavaDoc で HTML の &escape; のようなコードでエスケープする必要がありますか?

'<'ドキュメントに文字どおりに表示したいHTML 特殊文字以外は必要ありません。\uABCDjavadoc コメント内でシーケンスを使用できます。ソース ファイルを解析する前に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 ではそのように強調表示されますが、そうではありません。

于 2012-04-28T16:23:45.333 に答える
5

コメンターが示したように、ソース ファイルのエンコーディングは (少なくとも一部の) コンパイラに渡すことができます。この回答では、この情報を渡す方法をまとめます。

エクリプス

Eclipse (3.7 チェック済み) は特別な構成を必要とせず、次のような Java ソース コードを問題なく使用できます。

double π = Math.PI;

<javac encoding="UTF-8" ... >
</javac>

ジャワ

javac -encoding UTF-8 src/main/Foo.java

グラドル

javadoc {
    options.encoding = 'UTF-8'
}
于 2012-04-28T16:08:04.533 に答える