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
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 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 pouvezdé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!