この記事では、java.nio.charset.CharsetDecoder を使用して文字セットを自動的に識別する方法を紹介します は、インターネット上にある文字セットを自動的に識別する方法を研究しました。サードパーティのクラスライブラリ
jchardetを使用します。実際に jchardet を使用する cpdetector もあります。 JDK の java.nio.charset.CharsetDecoder を使用して文字セットを識別できることを偶然発見しました。 1. 原則一般に、InputStreamReader を構築するには 2 つの方法があります:
InputStreamReader reader = new InputStreamReader(in, charsetName);
InputStreamReader reader = new InputStreamReader(in, charset);
CharsetDecoder cd = charset.newDecoder(); InputStreamReader reader = new InputStreamReader(in, cd);
例外をスローします
:java.nio.charset.MalformedInputException: Input length = 1 at java.nio.charset.CoderResult.throwException(CoderResult.java:277) at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:338) at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177) ....
AutoCharsetReader は、上記の原則に基づいて、Reader を参照して記述されたクラスであり、Charset 適応型の InputStreamReader とみなすことができます。
もう 1 つの例は、フルテキスト
indexを作成する Lucene の TextField には Reader パラメータが必要です。このクラスを直接使用できます:
Field field = new TextField("content", new AutoCharsetReader(file));
ファイルを読み取った後、ファイルの文字セット。読後ですのでご了承ください。
Charset charset = ar.charset();
3. 代替文字セット
文字セットを最終決定するために複数の試行が使用されるため、代替文字セットを提供する必要があります。現在のコードで提供されるデフォルトの代替文字セットは次のとおりです。
private final static String[] _defaultCharsets = { "US-ASCII", "UTF-8", "GB2312", "BIG5", "GBK", "GB18030", "UTF-16BE", "UTF-16LE", "UTF-16", "UNICODE"};
代替文字セットを変更するメソッドも提供されます。例:
AutoCharsetReader ar = new AutoCharsetReader(in).setCharset("ascii", "utf-8", "gbk");
順序は検出結果に影響します。たとえば、GBK が GB2312 より前の場合、GBK には GB2312 が含まれるため、検出結果は GB2312 ではなく GBK のみになります。
4. 文字セット検出のみ
は文字セット検出のみに使用できます:
charset = AutoCharsetReader.quickDetect(file.toURI().toURL(), charsets); or: charset = AutoCharsetReader.deepDetect(file.toURI().toURL(), charsets, stops);
quickDetect は 1 文字のみを読み取り、単一の文字セット ファイルに適しています。 HTML の場合、文字セットを知るためにすべてを読む必要がある場合があるため、deepDetect を使用します。パラメーター
charsetsは
null にすることができます。 ファイルのセットが「utf-8」であることが検出された場合、既知の可能な文字セットは「ascii」、「utf-8」、「gb2312」、および「gbk」です。または「 gbk」を使用すると、ファイルの読み取りを続行せずに、結果をすぐに返すことができます。この時点で、stops パラメータを {"utf-8", "gbk"} に割り当てることができます。
nullの場合は、すべて読む必要があります。 5. その他
効率を上げるために、このクラスにはバッファが装備されています。最初の文字セットのデコードに失敗した場合、io を再読み込みする必要はありません。バッファ サイズのデフォルトは 8192 です。オブジェクトの構築時にバッファ サイズを自分で定義できます。パラメータが 16 未満の場合は、16 に設定します。
以上がjava.nio.charset.CharsetDecoder を使用して文字セット メソッドを自動的に識別するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。