Devinez le code de caractère en Java

introduction

Dans cet article, j'ai utilisé juniversalchardet.

juniversalchardet est une bibliothèque fournie par Mozilla qui fournit une fonction pour deviner le code de caractère en fonction de la fréquence d'occurrence des modèles de chaînes d'octets. Actuellement, le japonais prend en charge ISO-2022-JP, SHIFT-JIS et EUC-JP.

Environnement de développement

Préparation

Ajoutez ce qui suit aux dépendances maven

pom.xml


<dependency>
    <groupId>com.googlecode.juniversalchardet</groupId>
    <artifactId>juniversalchardet</artifactId>
    <version>1.0.3</version>
</dependency>

Exemple 1. Lire le fichier

Classe de détecteur

Cette fois, pour plus de polyvalence, prenons InputStream comme argument. Notez que l'instance InputStream passée en argument sera décalée vers l'avant. Si les données d'entrée de Universal Detector sont toutes des caractères à un octet, le résultat du jugement de code de caractère sera nul. Cette fois, dans un tel cas, la valeur par défaut de l'environnement est renvoyée.

Detector.java


import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import org.mozilla.universalchardet.UniversalDetector;

public class Detector {
  public static Charset getCharsetName(InputStream is) throws IOException {
    //Allouer une mémoire tampon de 4 Ko
    byte[] buf = new byte[4096];
    UniversalDetector detector = new UniversalDetector(null);

    //Continuez à lire InputStream jusqu'à ce que vous obteniez le résultat de la supposition du code de caractère
    int nread;
    while ((nread = is.read(buf)) > 0 && !detector.isDone()) {
      detector.handleData(buf, 0, nread);
    }
    
    //Obtenez des résultats approximatifs
    detector.dataEnd();
    final String detectedCharset = detector.getDetectedCharset();
    
    detector.reset();

    if (detectedCharset != null) {
      return Charset.forName(detector.getDetectedCharset());
    }
    //Si le code de caractère n'a pas pu être obtenu, utilisez la valeur par défaut de l'environnement
    return Charset.forName(System.getProperty("file.encoding"));
  }
}

Classe principale

Détermine le code de caractère du fichier et le transmet à la console. FileInputStream ne prend pas en charge le marquage / réinitialisation, il génère donc une autre instance pour la détermination du code de caractère et la sortie de la console.

Main.class


import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;

public class Main {
  public static void main(String[] args) throws IOException {
    final String path = "./test.txt";

    Charset cs;
    try (FileInputStream fis = new FileInputStream(path)) {
      cs = Detector.getCharsetName(fis);
      System.out.println("charset:" + cs);
    }

    try (BufferedReader br =new BufferedReader(new InputStreamReader(new FileInputStream(path), cs))) {
      br.lines().forEach(s -> System.out.println(s));
    }
  }
}

Exemple d'exécution

Résultat d'exécution


charset:SHIFT-JIS
AIUEO

Exemple 2. URL de décodage

De plus, utilisez le codec Apache commons.

pom.xml


<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.12</version>
</dependency>

Classe de détecteur

Detector.class


import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import org.mozilla.universalchardet.UniversalDetector;

public class Detector {
  public static Charset getCharsetName(byte[] bytes) {
    UniversalDetector detector = new UniversalDetector(null);
    //Si la chaîne de caractères d'entrée est trop courte, elle ne peut pas être devinée, alors répétez l'entrée.
    while (!detector.isDone()) {
      detector.handleData(bytes, 0, bytes.length);
      detector.dataEnd();
    }
    final String charsetName = detector.getDetectedCharset();
    detector.reset();
    if (charsetName != null) {
      return Charset.forName(charsetName);
    }
    return Charset.forName(System.getProperty("file.encoding"));
  }
}

Classe principale

Main.class


import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.net.URLCodec;

public class Main {
  public static void main(String[] args) throws DecoderException, UnsupportedEncodingException {
    final String str= "%82%a0%82%a2%82%a4%82%a6%82%a8";
    //Analyse les chaînes encodées en URL en tableaux d'octets
    byte[] bytes = new URLCodec()
        .decode(str, StandardCharsets.ISO_8859_1.name())
        .getBytes(StandardCharsets.ISO_8859_1.name());
    
    Charset cs = Detector.getCharsetName(bytes);
    System.out.println("charset:"+cs);

    //Convertir un tableau d'octets en chaîne à l'aide du jeu de caractères détecté
    final String s = new String(bytes,cs);
    System.out.println(s);
  }
}

Exemple d'exécution

Résultat d'exécution


charset:SHIFT-JIS
AIUEO

en conclusion

Veuillez noter qu'une détection erronée peut se produire si la chaîne de caractères d'entrée est trop courte. Le code de caractère est très gênant et les informations en anglais ne sont pas très riches car il s'agit d'une histoire liée uniquement à la famille de langues multi-octets. J'espère que vous trouverez cet article utile.

Recommended Posts

Devinez le code de caractère en Java
Code de caractère Java
Corrigez le code de caractère en Java et lisez à partir de l'URL
L'application absorbe la différence de code de caractère
Java avec Visual Studio Code
Écrire du code de type Java8 en Java8
Différences de code lors de l'utilisation du système de longueur en Java
Accéder à l'interface réseau avec Java
Environnement Java Spring dans vs Code
Spécifiez l'emplacement Java dans eclipse.ini
Décompressez le fichier zip en Java
Analyser l'analyse syntaxique de l'API COTOHA en Java
Appelez la super méthode en Java
Java Convertit des codes de caractères disparates en un même code de caractère à la fois
Évitez les erreurs de code de caractère en java lors de l'utilisation de l'extension VScode RUN-CODE
Exemple de code pour appeler l'API Yahoo! Local Search en Java
Exemple de code utilisant JMustache, le moteur de modèles Moustache en Java
Obtenez le résultat de POST en Java
Devinez le cadre de persistance Java 2017 (3) Reladomo
Référence Java à comprendre dans la figure
OCR en Java (reconnaissance de caractères à partir d'images)
Essayez d'utiliser l'API Stream en Java
Appelez l'API de notification Windows en Java
J'ai essayé le nouveau yuan à Java
[Java] Utiliser la technologie cryptographique avec les bibliothèques standard
Organisation des notes dans la tête (Java-Arrangement)
Essayez d'appeler le service CORBA sur Java 11+
Quelle est la méthode principale en Java?
Toutes les mêmes chaînes de code de hachage en Java
Comment obtenir la date avec Java
Exécutez le code Java stocké dans le presse-papiers.
L'histoire de l'écriture de Java dans Emacs
Entrée de la console en Java (comprendre le mécanisme)
[Mac] Installer Java dans Visual Studio Code
Exécuter du code Java de manière scriptée
CONSEILS relatifs au code Java
Partition en Java
Exemple de code Java 02
Exemple de code Java 03
Changements dans Java 11
Janken à Java
Exemple de code Java 04
Exemple de code Java 01
Taux circonférentiel à Java
Si vous rencontrez des problèmes avec le problème de code de caractère du Myanmar (birman)
FizzBuzz en Java
Concernant les modificateurs transitoires et la sérialisation en Java
L'histoire de la comparaison de chaînes de bas niveau en Java
[Java] Gestion des Java Beans dans la chaîne de méthodes
À propos de la confusion observée dans les serveurs Java de démarrage
L'histoire de la fabrication d'un Othello ordinaire à Java
Ajouter l'option --enable-preview dans Java dans Visual Studio Code
À propos de l'idée des classes anonymes en Java
ChatWork4j pour l'utilisation de l'API ChatWork en Java
Une histoire sur le JDK à l'ère de Java 11
Techniques de lecture du code source Java dans Eclipse
Mémo organisé dans la tête (syntaxe Java --Control)
Analyse de code statique par Checkstyle avec Java + Gradle
Le type d'intersection introduit dans Java 10 est incroyable (?)
L'histoire de l'apprentissage de Java dans la première programmation