In diesem Artikel habe ich [juniversalchardet] verwendet (https://code.google.com/archive/p/juniversalchardet/).
juniversalchardet ist eine von Mozilla bereitgestellte Bibliothek, die eine Funktion zum Erraten des Zeichencodes basierend auf der Häufigkeit des Auftretens von Byte-String-Mustern bietet. Derzeit unterstützt Japanisch ISO-2022-JP, SHIFT-JIS und EUC-JP.
Fügen Sie den Maven-Abhängigkeiten Folgendes hinzu
pom.xml
<dependency>
<groupId>com.googlecode.juniversalchardet</groupId>
<artifactId>juniversalchardet</artifactId>
<version>1.0.3</version>
</dependency>
Nehmen wir diesmal aus Gründen der Vielseitigkeit InputStream als Argument. Beachten Sie, dass die als Argument übergebene InputStream-Instanz vorwärts versetzt wird. Wenn die Eingabedaten des Universal Detector alle Einzelbytezeichen sind, ist das Ergebnis der Zeichencodebeurteilung null. In diesem Fall wird diesmal der Standardwert der Umgebung zurückgegeben.
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 {
//Weisen Sie einen 4-KB-Speicherpuffer zu
byte[] buf = new byte[4096];
UniversalDetector detector = new UniversalDetector(null);
//Lesen Sie InputStream weiter, bis Sie das Schätzergebnis des Zeichencodes erhalten
int nread;
while ((nread = is.read(buf)) > 0 && !detector.isDone()) {
detector.handleData(buf, 0, nread);
}
//Erraten Sie Ergebnisse
detector.dataEnd();
final String detectedCharset = detector.getDetectedCharset();
detector.reset();
if (detectedCharset != null) {
return Charset.forName(detector.getDetectedCharset());
}
//Wenn der Zeichencode nicht abgerufen werden kann, verwenden Sie die Umgebungsvorgabe
return Charset.forName(System.getProperty("file.encoding"));
}
}
Bestimmt den Zeichencode der Datei und gibt ihn an die Konsole aus. FileInputStream unterstützt das Markieren / Zurücksetzen nicht und generiert daher eine weitere Instanz für die Zeichencodebestimmung und die Konsolenausgabe.
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));
}
}
}
Ausführungsergebnis
charset:SHIFT-JIS
AIUEO
Verwenden Sie außerdem den Apache Commons Codec.
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);
//Wenn die Eingabezeichenfolge zu kurz ist, kann sie nicht erraten werden. Wiederholen Sie die Eingabe.
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";
//Analysiert URL-codierte Zeichenfolgen in Byte-Arrays
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);
//Konvertieren Sie ein Byte-Array mit dem erkannten Zeichensatz in eine Zeichenfolge
final String s = new String(bytes,cs);
System.out.println(s);
}
}
Ausführungsergebnis
charset:SHIFT-JIS
AIUEO
Bitte beachten Sie, dass eine fehlerhafte Erkennung auftreten kann, wenn die eingegebene Zeichenfolge zu kurz ist. Der Zeichencode ist sehr problematisch, und die Informationen auf Englisch sind nicht sehr umfangreich, da es sich um eine Geschichte handelt, die sich nur auf die Mehrbyte-Sprachfamilie bezieht. Ich hoffe, Sie finden diesen Artikel hilfreich.
Recommended Posts