1

あらゆる種類のテキストベースの入力を取り込むJava(7 SE)アプリを作成していますが、JREがサポートしていない文字セット/エンコードに遭遇することを懸念しています(たとえば、このアプリはLinuxボックスで実行されますが、すべての主要なOSで生成されたファイルを取り込むなど)。

1つは、サポートされていない文字セット/エンコーディングIOExceptionに遭遇した場合に(または同様の)をキャッチする方法はありますか?InputStreamReader

そして、複数のエンコーディングを含む入力はどうですか?4つの異なるタイプの入力があるとします。

  • java.lang.String
  • プレーンテキスト(.txt)ファイル
  • Word(.docx)ファイル
  • PDFファイル

これらの入力の1つを読み取っていて、複数の(ただしサポートされている)文字エンコードが発生し始めた場合はどうなりますか?JREはこれをネイティブに処理しますか、それとも、それぞれが独自の文字セット/エンコーディングで構成された複数のリーダーが必要ですか?

このような場合、ストリーミング入力を単一の標準化された(UTF-8である可能性が最も高い)セット/エンコーディングに「正規化」できますか?前もって感謝します。

4

1 に答える 1

3

最初の質問に答えるために、CharsetDecoderを作成し、不正な入力に遭遇したときに何をしたいかを指定できます。

CharsetDecoder charsetDecoder = Charset.forName("utf-8").newDecoder();
charsetDecoder.onMalformedInput(myCustomErrorAction);
charsetDecoder.onUnmappableCharacter(myCustomErrorAction);
Reader inputReader = new InputStreamReader(inputStream, charsetDecoder);

文字セット全体がサポートされていない場合をキャッチすると、次のようになります。

if( Charset.isSupported(encodingSpecified)) {
    //Normal case
} else {
    //Error case
}

ただし、複数のエンコーディングについてはよくわかりません。単一のバイナリストリームが複数のエンコーディングを持つことは非常に珍しいことだと思います。ストリームには、エンコーディングの変更を示すカスタムの方法が必要です。そのインジケーターを探すために、ストリームから一度に1文字ずつ読み取る必要があります。これに遭遇した場合は、同じストリーム上に新しいエンコーディングで新しいリーダーを作成する必要があります。

いずれの場合も、Javaでは、バイトのストリームから文字のストリームに移行すると、それらの文字は特定のエンコーディングなしでメモリに表されるため、データをどこかに保存しない限り、正規化する必要はありません。 。後でそのデータをファイルに保存する場合は、1つのエンコーディングを選択し、それを使用してすべてのデータを保存することを強くお勧めします。

于 2013-02-26T14:12:05.550 に答える