Errate den Zeichencode in Java

Einführung

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.

Entwicklungsumgebung

Vorbereitung

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>

Beispiel 1. Datei lesen

Detektorklasse

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"));
  }
}

Hauptklasse

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ührungsbeispiel

Ausführungsergebnis


charset:SHIFT-JIS
AIUEO

Beispiel 2. Dekodierungs-URL

Verwenden Sie außerdem den Apache Commons Codec.

pom.xml


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

Detektorklasse

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"));
  }
}

Hauptklasse

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ührungsbeispiel

Ausführungsergebnis


charset:SHIFT-JIS
AIUEO

abschließend

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

Errate den Zeichencode in Java
Java-Zeichencode
Korrigieren Sie den Zeichencode in Java und lesen Sie von der URL
Die Anwendung absorbiert den Unterschied im Zeichencode
Java mit Visual Studio Code
Schreiben Sie Java8-ähnlichen Code in Java8
Unterschiede im Code bei Verwendung des Längensystems in Java
Greifen Sie mit Java auf die Netzwerkschnittstelle zu
Java Spring-Umgebung in vs Code
Geben Sie den Java-Speicherort in eclipse.ini an
Entpacken Sie die Zip-Datei in Java
Analysieren der COTOHA-API-Syntaxanalyse in Java
Rufen Sie die Super-Methode in Java auf
Java Konvertiert unterschiedliche Zeichencodes gleichzeitig in denselben Zeichencode
Vermeiden Sie Zeichencodefehler in Java, wenn Sie die VScode-Erweiterung RUN-CODE verwenden
Beispielcode zum Aufrufen der Yahoo! Local Search API in Java
Beispielcode mit JMustache, der Moustache-Vorlagen-Engine in Java
Holen Sie sich das Ergebnis von POST in Java
Erraten Sie das Java Persistence Framework 2017 (3) Reladomo
Java-Referenz zum Verständnis in der Abbildung
OCR in Java (Zeichenerkennung aus Bildern)
Versuchen Sie es mit der Stream-API in Java
Rufen Sie die Windows-Benachrichtigungs-API in Java auf
Ich habe das neue Yuan-Problem in Java ausprobiert
[Java] Verwenden Sie kryptografische Technologie mit Standardbibliotheken
Notizen im Kopf organisieren (Java-Arrangement)
Versuchen Sie, den CORBA-Dienst unter Java 11+ aufzurufen
Was ist die Hauptmethode in Java?
Alle gleichen Hash-Code-Zeichenfolgen in Java
So erhalten Sie das Datum mit Java
Führen Sie den in der Zwischenablage gespeicherten Java-Code aus.
Die Geschichte des Schreibens von Java in Emacs
Konsoleneingabe in Java (Verständnis des Mechanismus)
[Mac] Installieren Sie Java in Visual Studio Code
Führen Sie Java-Code skriptweise aus
Java-Code-TIPPS
Partisierung in Java
Java-Beispielcode 02
Java-Beispielcode 03
Änderungen in Java 11
Janken in Java
Java-Beispielcode 04
Java-Beispielcode 01
Umfangsrate in Java
Wenn Sie Probleme mit dem Zeichencode-Problem in Myanmar (Burmesisch) haben
FizzBuzz in Java
In Bezug auf transiente Modifikatoren und Serialisierung in Java
Die Geschichte des einfachen String-Vergleichs in Java
[Java] Behandlung von Java Beans in der Methodenkette
Über die Verwirrung beim Starten von Java-Servern
Die Geschichte eines gewöhnlichen Othello in Java
Fügen Sie in Java in Visual Studio Code die Option --enable-Preview hinzu
Über die Idee anonymer Klassen in Java
ChatWork4j für die Verwendung der ChatWork-API in Java
Eine Geschichte über das JDK in der Java 11-Ära
Techniken zum Lesen von Java-Quellcode in Eclipse
Organisiertes Memo im Kopf (Java - Control Syntax)
Führen Sie eine statische Code-Analyse mit Checkstyle mit Java + Gradle durch
Der in Java 10 eingeführte Schnittpunkttyp ist erstaunlich (?)
Die Geschichte des Lernens von Java in der ersten Programmierung