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.
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>
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"));
}
}
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));
}
}
}
Résultat d'exécution
charset:SHIFT-JIS
AIUEO
De plus, utilisez le codec Apache commons.
pom.xml
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.12</version>
</dependency>
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"));
}
}
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);
}
}
Résultat d'exécution
charset:SHIFT-JIS
AIUEO
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.