Maison  >  Article  >  Java  >  Utilisez java.nio.charset.CharsetDecoder pour identifier automatiquement les méthodes de jeu de caractères

Utilisez java.nio.charset.CharsetDecoder pour identifier automatiquement les méthodes de jeu de caractères

高洛峰
高洛峰original
2017-03-12 09:43:232319parcourir

Cet articleprésentel'utilisation de java.nio.charset.CharsetDecoder pour identifier automatiquement la jeu de caractèresméthode

recherche les méthodes qui peut être utilisé sur Internet. Le moyen le plus efficace d'identifier automatiquement les jeux de caractères est d'utiliser la bibliothèque de classes tierce jchardet. Il existe également cpdetector, qui utilise en fait jchardet. J'ai accidentellement découvert que java.nio.charset.CharsetDecoder de jdk peut être utilisé pour identifier les jeux de caractères.

1. Principe

Généralement, deux méthodes sont utilisées pour construire InputStreamReader :

InputStreamReader reader = new InputStreamReader(in, charsetName);

ou

InputStreamReader reader = new InputStreamReader(in, charset);

Si le jeu de caractères ne correspond pas, des caractères tronqués seront affichés.

Il existe également une méthode de construction, qui consiste à utiliser CharsetDecoder :

CharsetDecoder cd = charset.newDecoder();
InputStreamReader reader = new InputStreamReader(in, cd);

S'il n'y a pas de correspondance à ce moment-là, lève une exception  :

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)
        ....

De cette façon, il peut être utilisé comme détection de jeu de caractères.

2. Utilisation d'AutoCharsetReader

AutoCharsetReader est une classe écrite sur la base des principes ci-dessus et en référence à InputStreamReader hérite de <.>Reader , peut être vu comme InputStreamReader adaptatif Charset.

AutoCharsetReader ar= new AutoCharsetReader(in);char c = ar.read();
...char[] cbuf = new char[2000];
ar.read(cbuf);
...
BufferedReader br = new BufferedReader(ar);
br.readLine();
...

Un autre exemple est TextField de Lucene qui crée un

index en texte intégral qui nécessite un paramètre Reader. Vous pouvez utiliser cette classe. directement :

Field field = new TextField("content", new AutoCharsetReader(file));

Après avoir lu le fichier, vous pouvez obtenir le jeu de caractères du fichier. Attention, c'est après lecture.

Charset charset = ar.charset();

3. Jeu de caractères alternatif

En raison de l'utilisation de plusieurs tente de finaliser le jeu de caractères, des alternatives doivent donc être fournies. Les jeux de caractères alternatifs par défaut fournis par le code actuel sont les suivants :

    private final static String[] _defaultCharsets = {        
            "US-ASCII",            "UTF-8",            "GB2312", 
            "BIG5",            "GBK",            "GB18030",                
            "UTF-16BE", 
            "UTF-16LE", 
            "UTF-16",            "UNICODE"};

Des méthodes pour modifier le jeu de caractères alternatif sont également fournies. Par exemple :

AutoCharsetReader ar = new AutoCharsetReader(in).setCharset("ascii", "utf-8", "gbk");

L'ordre affectera les résultats de détection. Par exemple, si GBK est antérieur à GB2312, le résultat de la détection ne peut être que GBK, et non GB2312, car GBK contient GB2312.

4. Uniquement pour la détection du jeu de caractères

peut être utilisé uniquement pour la détection du jeu de caractères :

charset = AutoCharsetReader.quickDetect(file.toURI().toURL(), charsets);
or:
charset = AutoCharsetReader.deepDetect(file.toURI().toURL(), charsets, stops);

quickDetect ne lit qu'un seul caractère et convient aux fichiers à jeu de caractères unique. Pour le HTML, vous devrez peut-être tout lire pour connaître le jeu de caractères, utilisez donc deepDetect. Le paramètre

charsets peut être null.

Si pour un ensemble de fichiers, les jeux de caractères possibles connus sont "ascii", "utf-8", "gb2312" et "gbk", lorsqu'il est détecté que le jeu de caractères d'un fichier est "utf-8" ou "gbk", le résultat peut être renvoyé immédiatement sans continuer la lecture du fichier. À ce stade, vous pouvez attribuer le paramètre

stops à {"utf-8", "gbk"}. S'il est null, vous devez tout lire.

5. Autres

Afin d'améliorer l'efficacité, cette classe dispose d'un tampon Si le décodage du jeu de caractères initial échoue, il n'y en a pas. il faut relire io. La taille du tampon par défaut est 8192. Vous pouvez

définir vous-même la taille du tampon lors de la construction de l'objet Si le paramètre est inférieur à 16, définissez-le sur 16.


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn