Wie lässt sich der String eines Unicode-Entitys in einen char konvertieren?

Möchte man in Java mit Sonderzeichen arbeiten, so lassen sich diese durch deren Unicode-Repräsentanz darstellen. Diese folgt der Syntax: \uXXXX wobei die angegebenen 'X' für die vierstellige hexadezimale Unicode-Ordnungszahl stehen. Leere Stellen werden nach links mit '0' aufgefüllt. Ein ü wird z.B. durch \u00FC repräsentiert, wobei die Angabe als char, in einfachen Anführungszeichen oder als String in doppelten Anführungszeichen erfolgen kann.

Ein Unicode-Entity wird immer mit einem Backslash eingeleitet, der das folgende 'u' maskiert, d.h. als Zeichen mit Sonderfunktion kennzeichnet. Trifft der Compiler auf ein derartiges Entity, so ersetzt er die gesamte Folge bis zum abschließenden Semikolon durch die entsprechende Character-Repräsentanz, da die Zeichenfolge '\u' angibt, dass die folgenden Stellen als Unicode-Hexadezimalwert zu interpretieren sind.

\u00FC → ü

Möchte man das Unicode-Entity als solches darstellen, so reicht es, den Backslash selbst wiederum mit einem Backslash zu maskieren, das Entity somit mit einem doppelten Backslash beginnen zu lassen:

\\u00FC → \u00FC

Hierdurch wird der Backslash selbst maskiert und dient nicht mehr zusammen mit dem nachfolgenden 'u' als Character-Repräsentanz.

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.math.BigInteger;

public class CharAusUnicode {

    public static void main(String[] args) {

        System.out.println("Entity-String: \u00FC"); // ü

        System.out.println("String aus CharArray: " + stringFromCharArray()); // \u00FC

        System.out
                .println("Entity-String aus Datei: " + stringFromFileString()); // \u00FC

        System.out.println("Konvertierter Entity-String aus Datei: "
                + convertUnicode(stringFromFileString())); // ü
    }

    private static String stringFromFileString() {
        String s = "", str = "";
        BufferedReader buff = null;
        try {
            buff = new BufferedReader(new FileReader(new File(
                    "test.txt")));
            while ((s = buff.readLine()) != null) {
                str += s;
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return str;
    }

    private static String stringFromCharArray() {
        char[] c = { '\\', 'u', '0', '0', 'F', 'C' };
        return new String(c);
    }

    private static String convertUnicode(String s) {
        if (s.startsWith("\\u")) {
            String numberStr = s.substring(2);
            char c = (char) new BigInteger(numberStr, 16).intValue();
            return new Character(c).toString();
        }
        return s;
    }
}

Bei der Entwicklung der Transformation von fremdsprachigen Zeichensätzen in HTML-Entities in Cent stand ich vor der Aufgabe, die Stringrepräsentationen der jeweiligen Zeichen aus einer Datei einzulesen. Das Problem hierbei besteht darin, dass der Entity-String in der Datei aus einer Folge von Einzelzeichen besteht, denen ihrerseits jeweils eine hexadezimale Entity-Form zugeordnet werden kann. Der in der Datei lesbare Entity-String besteht also selbst aus einer Folge von Entity-Strings, bzw. deren Zeichenform. Vorstellen kann man sich das Ganze ähnlich einem Character-Array. Um hieraus ein einziges Zeichen zu erzeugen, muss der numerische Anteil des Entity-Strings in seine hexadezimale Form überführt werden. Dies ist durch die Klasse java.math.BigInteger möglich, die zwei Konstruktoren bereit stellt, die String-Repräsentationen eines BigInteger in einen BigInteger-Wert wandeln. Bei dem hier verwendeten Konstruktor wird als zweiter Parameter die Basis 16 des gewünschten hexadezimalen Zahlensystems übergeben. Das gebildete BigInteger-Objekt wird anschließend zunächst in den primitiven Datentyp char gecastet und dann als String zurück gegeben.
Die Methode convertUnicode(String s) im Beispiel demonstriert das Gesagte.

Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.