java.nio.charset.CharsetDecoder を使用して文字セット メソッドを自動的に識別する

高洛峰
リリース: 2017-03-12 09:43:23
オリジナル
2325 人が閲覧しました

この記事では、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);
ログイン後にコピー

文字セットが一致しない場合、 d文字が出力されます。

CharsetDecoderを使用する構築方法もあります:

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)
        ....
ログイン後にコピー

このようにして使用できます。文字セット検出として。

2. AutoCharsetReader の使用

AutoCharsetReader は、上記の原則に基づいて、Reader を参照して記述されたクラスであり、Charset 適応型の InputStreamReader とみなすことができます。

もう 1 つの例は、フルテキスト

index

を作成する Lucene の TextField には Reader パラメータが必要です。このクラスを直接使用できます:

ファイルを読み取った後、ファイルの文字セット。読後ですのでご了承ください。

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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート