2011-08-11 7 views
7

Javaのchar型は、特定のエンコーディングに格納されることが保証されていますか?Javaのcharがどのエンコーディングに格納されていますか?

編集:私はこの質問を誤って言いました。私が尋ねる意味は、は、特定のエンコーディングを使用することが保証されているcharリテラルですか?

+0

あなたの質問への簡単な回答は、**いいえ保証されていません** –

+1

はい、あります。内部表現は非常によく定義されています。 –

+1

@Ernest - そうではありません。標準のJavaライブラリクラスの多くは、 'char'にUnicodeコードユニットが含まれていると仮定して動作するように設計されていますが、アプリケーションは基本的に16ビットの符号なし整数値を' char'に入れます。この値は、特定の方法でエンコードする必要はありません。完全な(または部分的な) "文字"を表す必要はありません。 –

答えて

13

「保存済み」はどこですか? Javaのすべての文字列はrepresented in UTF-16です。ファイルに書き込まれたり、ネットワーク経由で送信されたり、他のものが送信されたときは、指定した文字エンコードを使用して送信されます。

編集:具体的にはcharタイプの場合は、Character docsを参照してください。具体的には次のとおりです。「charデータ型...は元のUnicode仕様に基づいており、文字は固定幅の16ビットエンティティとして定義されています。したがって、charintをキャストすると、charに実際にその文字セットの文字が含まれている場合、UTF-16の値は常にになります。 charにランダムな値を入れただけでは、必ずしも有効なUTF-16文字であるとは限りません。同様に、不正なエンコーディングを使用して文字を読み取った場合も同様です。ドキュメントでは、charに十分なスペースがないため、補助UTF-16文字がintでしか表現できないことについて議論しています。このレベルで操作している場合、よく知っておくことが重要ですそれらのセマンティクスで。

+0

私は実際に文字列ではなくcharに興味があります。私がintにキャストするかのように "Stored"は、特定のエンコーディングになることが保証されていますか? – pepsi

+0

@pepsi:更新された私の答え –

+0

完璧な、そのリンクは私が探していたものです。ありがとう! – pepsi

2

元々、JavaはUCS-2を内部的に使用していました。現在はUTF-16を使用しています。この2つは、D800-DFFFを除き、実質的に同一です。これは、大文字の拡張表現の一部としてUTF-16で使用されます。

4

Java charは、通常、aを保持するために使用されます。Unicode code unit;すなわち、有効なUTF-16シーケンスの一部である16ビット単位である。しかし、アプリケーションが実際に何を意味するかにかかわらず、16ビットの符号なしの値をcharに入れることをアプリケーションが防止するものは何もありません。

ですから、Unicodeコード単位charで表すことができるとcharはUnicodeコード単位を表すことができます...しかし、これらのいずれも一般的なケースでは、必ずしも真実であることを言うことができます。

Java charがどのように保存されているかについてのご質問にはお答えできません。単純に、それはあなたが「保存」で何を意味するかに依存して、言った:あなたは「実行中のプログラムで表現」を意味するならば、答えはJVMの実装固有のもの

  • 。あなたが意味する場合(それがまたは特定のコンテキストに応じて、整列機械語であってもなくてもよいけれどもcharデータ型は、通常、16ビットマシンの整数として表されます。)

  • 「ファイルに保存されている」か何かのようにその答えは、アプリケーションがそれをどのように保存するかについて、に完全に依存するです。


任意の特定のエンコーディングで保存されることが保証のJava char型ですか?

私が上記の答えに照らして、答えは「いいえ」です。実行中のアプリケーションでは、charが何を意味するのかは、アプリケーションによって決まります。 charがファイルに保存されると、アプリケーションはそのファイルの保存方法と使用するディスク上の表現を決定します。


フォロー

何文字リテラルは?たとえば、 'c'には言語で定義された値が必要です。

これは文字のリテラルの形式とその文字に依存します。たとえば、 'c'は小文字の 'c'のUnicodeコードポイントの下位16ビットの値を持ちます。しかし、 '\ uxxxx'として表現されたリテラルは、有効なUnicodeコードポイントを表すことはできません。または(アプリケーションの意味に応じて)文字を全く表さないかもしれません。

これは、ソースコードファイルのエンコーディングによって(潜在的に)複雑になります。理論的には、(大文字のために)大文字が小文字でエンコードされ、その逆も同様であるカスタム文字エンコードでソースコードを表現することは可能です。これを実行し、コンパイラを起動する前に対応するCharsetエンコーダとデコーダを登録できた場合、'c'(ASCIIまたはUTF-8として入力を表示)のようなリテラルは、実際にはコンパイラプログラムの値6799ではなく

少なくとも私はそう...ここ

とは別のエッジケースだと思う:

String s = "\u0001\uxxxx"; 

は2つのコード単位と一つのコードポイントを含む文字列を表すが、

char c = '\u0001\uxxxx'; 

ですパーサーは1つのコードポイントを認識しますが、そのコードポイントはcharに収まりません。

+0

'¥uxxxx'として表現されたリテラルは、有効なコードポイントを表していないのですか?あなたは例を挙げることができますか? – Philipp

+0

0-65535の範囲の一部の値は、有効なコード・ポイントではないUnicode仕様によって定義されています。 65535は、 "非文字"である例ではありません。他は「割り当てられていない」。詳細はhttp://www.unicode.org/versions/Unicode6.0.0/ch16.pdfを参照してください。 –

+0

0-65535の範囲のすべての整数は有効なコードポイントです。 – Philipp

関連する問題