2

Java 仕様 SE 7 エディションから

§3.1ユニコード

プログラムは Unicode 文字セットを使用して作成されます。

§3.2字句翻訳

生の Unicode 文字ストリームは、次の 3 つの字句変換手順を使用して、一連のトークンに変換されます...

私はネイティブの文字エンコーディング (Windows-1252) でソース コードを書いており、仕様では (?) すべて生の Unicode 文字ストリームから始まり、字句変換 (Unicode エスケープ変換を含む) が実行されると述べているため、混乱しています。 .

彼らは、Unicodeエスケープを使用して、ASCII文字のみを使用して任意のUnicode文字を含めることができると述べています。以前の変換が実行された場合、それらは Unicode 文字セットのサブセット内の ASCII 文字を参照していると思います。これは理にかなっています。

ソース ファイルを Unicode に書き込むために使用されたエンコーディングからの以前の変換はありますか?

いくつかの情報は関連していますが、それはコンパイルプロセスではなく、実行時のテキスト処理のようなものだと思います:

非 Unicode テキストの変換

4

2 に答える 2

4

基本的に、仕様が言っていることは、ソース ファイルでは Unicode 文字のみを使用できるということです。これらの文字が実際にバイトにエンコードされる方法は定義されていません。それはあなたとあなたが取り組んでいるプラットフォーム次第です。

基本的に、コンパイラの内部では、ソース ファイルがバイト ストリームとしてディスクから読み取られ、それらのバイトが Java の Unicode 文字の内部表現に変換されます。-encodingソース ファイルの raw バイトを Unicode 文字に変換する方法は、 に渡されるオプションに基づきますjavac。オプションが設定されていない場合-encoding、プラットフォームのデフォルトのエンコーディングが使用されます。

ここで、コンパイラがソース コード バイトを文字に変換した後、別の手順を実行して文字リテラル (例: \u00a5123) を適切な 1 つの Unicode 文字に変換することに注意することも重要です。これは、実際には、質問で引用したセクション 3.2 で参照されている 3 つのステップの最初のステップです。このようにして、プレーンな ASCII 文字だけを使用して、ソース内の任意の Unicode 文字を表すことができます。

于 2012-08-16T20:59:48.863 に答える
2

「Unicode」はエンコーディングではなく、単に文字と関連する数字 (または「コードポイント」) のリストですが、従来の文字セットとは異なり、数字は Unicode 文字のディスク上の表現ではありません。Unicode 文字をエンコードまたはデコードするには、バイト シーケンスから Unicode 番号、さらには Unicode 文字にマップする別のエンコードが必要です。

UTF-8 などの一部のエンコーディングは、可能なすべての Unicode コード ポイントをエンコードするように設計されています。Windows CP 1252 などの他のものは、Unicode 文字の小さなサブセットしか表現できません。ただし、有効な Windows CP 1252 データは、Unicode コードポイントの有効なシーケンスにデコードできます。

したがって、はい、ディスク上の表現から仮想 Unicode 文字ストリームへの変換があります。

于 2012-08-16T21:08:18.660 に答える