1

私の理解では、Java はデフォルトで UTF-16 を使用し (Stringおよびcharおそらく他のタイプに対して)、UTF-16 は地球上のほとんどの文字エンコーディングの主要なスーパーセットです (ただし、私は間違っている可能性があります)。しかし、UTF-16 がサポートしていないエンコーディングで生成されたファイルを読み取るときに、アプリを保護する方法が必要です (多くの場合、またはまったくない場合はわかりません)。

だから私は尋ねます:

  1. ファイルを読み取る前にファイルが UTF-16 であると想定しても安全ですか、それとも NPE やその他の不正な入力例外が発生しない可能性を最大限に高めるために、JUniversalCharDet、JCharDet、ICU4J などの文字エンコーディング検出器を使用して最初にファイルを検出する必要がありますか?エンコーディング?
  2. OutputStream次に、ファイルに書き込むときに、文字列またはファイルに書き込むときにガベージ テキスト/文字を生成するメモリ内オブジェクト (文字列、 など) に文字/バイトが作成されていないことを確認する必要があります。 . 理想的には、このガベージを生成する文字が、書き込んでいるファイルに作成する前に、何らかの方法で確実にキャッチされるようにしたいと考えています。これを防ぐにはどうすればよいですか?

前もって感謝します。

4

2 に答える 2

1

バイトと文字の間の変換が行われるときはいつでも、Javaは使用される文字エンコーディングを指定することを許可します。指定されていない場合は、マシンに依存するデフォルトのエンコーディングが使用されます。一部のエンコーディングでは、特定の文字を表すビットパターンは、UTF-16エンコーディングで同じ文字に使用されるビットパターンと類似していません。

したがって、質問1の答えは「いいえ」であり、ファイルがUTF-16でエンコードされていると想定することはできません。

どの文字を表現できるかは、使用するエンコーディングによって異なります。

于 2013-02-26T21:44:28.610 に答える
1

Javaは通常、文字の内部表現に UTF-16 を使用します。n Javachar配列は、UTF-16 でエンコードされた Unicode コードポイントのシーケンスです。デフォルトでcharは、値はビッグ エンディアンと見なされます (Java 基本型と同様)。charただし、値を使用して文字列をファイルまたはメモリに書き込むべきではありません。Java API の文字エンコード/デコード機能を利用する必要があります (以下を参照)。

UTF-16 はエンコーディングの主要なスーパーセットではありません。実際、UTF-8 と UTF-16 はどちらも、任意の Unicode コード ポイントをエンコードできます。その意味で、Unicode、現代のコミュニケーションで使用する可能性のあるほぼすべての文字を定義しています。

ディスクからファイルを読み取り、UTF-16 を想定すると、すぐに問題が発生します。ほとんどのテキスト ファイルは、1 バイトの 8 ビットすべてを使用するために ASCII または ASCII の拡張を使用しています。これらの拡張子の例は、UTF-8 (任意の ASCII テキストの読み取りに使用できます) または ISO 8859-1 (ラテン語) です。次に、これらの拡張機能の拡張である Windows で使用されるなど、多くのエンコーディングがあります。UTF-16 はASCII と互換性がないため、ほとんどのアプリケーションでデフォルトとして使用しないでください。

そうです、不明なエンコーディングの多くのプレーン テキスト ファイルを読みたい場合は、ある種の検出器を使用してください。これで質問 1 に答えるはずです。

質問 2 については、完全に ASCII のファイルを考えてみてください。ここで、ASCII にない文字を追加します。UTF-8 を選択します (これはかなり安全な賭けです)。ファイルを開くプログラムが、UTF-8 を使用する必要があることを正しく推測していることを知る方法はありません。ラテン語を使用しようとするか、さらに悪いことに、7 ビット ASCII を使用しようとする可能性があります。その場合、ゴミが発生します。残念ながら、これが起こらないようにする賢い方法はありません。

CharsetEncoderおよびクラスを調べてCharsetDecoder、Java がエンコード/デコードを処理する方法を確認します。

于 2013-02-26T21:46:24.437 に答える