Maison > Java > javaDidacticiel > 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

高洛峰
Libérer: 2017-03-12 09:43:23
original
2374 Les gens l'ont consulté

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);
Copier après la connexion

ou

InputStreamReader reader = new InputStreamReader(in, charset);
Copier après la connexion

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);
Copier après la connexion

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)
        ....
Copier après la connexion

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();
...
Copier après la connexion

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));
Copier après la connexion

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();
Copier après la connexion

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"};
Copier après la connexion

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");
Copier après la connexion

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);
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Derniers numéros
Impossible d'installer Java
Depuis 1970-01-01 08:00:00
0
0
0
Java peut-il être utilisé comme backend du Web ?
Depuis 1970-01-01 08:00:00
0
0
0
Installer JAVA
Depuis 1970-01-01 08:00:00
0
0
0
Aide : Données chiffrées JAVA Décryptage PHP
Depuis 1970-01-01 08:00:00
0
0
0
Est-ce en langage Java ?
Depuis 1970-01-01 08:00:00
0
0
0
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal