Import Unicode Textfile

Hallo,

ich stehe vor dem Problem ein Textfile zu importieren, welches Unicode-Zeichen wie
\u00E4 enthält.

Beim Einlesen sollen diese Zeichen automatisch in die normalen lesbaren Zeichen ("ä", "ö", ...) umgewandelt werden.

Wie kann ich das am einfachsten bewerkstelligen?
 
Funktioniert leider nicht.
Wenn ich mir die eingelesene Zeile im Debugger anschaue, steht da jetzt statt \u00E4 \\u00E4.
Auf der Konsole ausgegeben: \u00E4

Leider nix mit ä, ö, oder ü ... 🙂
 
auf der Konsole wird wohl nur dann \u00E4 ausgegeben wenn in der Quelle auch wirklich \, u, 0, 0, E, 4 als sechs verschiedene Zeichen stehen,
ist das so oder kannst du eine Beispieldatei hochladen?

das umzuwandeln wäre dann jedenfalls eine richtige Rechenaufgabe, fertigen Code kennn ich dafür nicht,
nach \u suchen, die 4 Zeichen danach als String herausschneiden, hexadezimal parsen, die Zahl als char interpretiert weiterreichen
 
Genau, in der Textdatei steht tatsächlich "m\u00E4hen" (soll also mähen heißen)
Wenn ich direkt im Quelltext schreibe
Java:
String s = "m\u00E4hen";
und s dann ausgebe, wird auch "mähen" ausgegeben.

Beim Einlesen der Datei wird also quasi vor dem "\u00E4" noch ein "\" gesetzt.
Wenn man jetzt nach "\\" suchen könnte und durch "\" ersetzt, vlt. funktioniert das.
 
nein das funktioniert nicht, der Compiler macht quasi das was du suchst, aber mit einer String-Ersetzung ist es nicht getan,
da muss man schon all die Einzelschritte ausführen, die ich zuvor genannt hatte, wie es der Compiler auch macht,

ganz geschickt könntest du den Text der Datei natürlich in .java-Quellcode einfügen (einmalig manuell oder per Programm für beliebige Dateien),
kompilieren und ausführen lassen und die Ausgabe von dort weiterverwenden,
aber viel viel aufwendiger als 5 Zeilen mal richtig was zu programmieren 😉
 
Zuletzt bearbeitet von einem Moderator:
da muss man schon all die Einzelschritte ausführen, die ich zuvor genannt hatte, wie es der Compiler auch macht

Aber genau die Geschichte funktioniert ja nicht:
Java:
InputStreamReader r = new InputStreamReader(new FileInputStream("test.txt"), "UTF-8");
BufferedReader br = new BufferedReader(r);
System.out.println(br.readLine());

...als 5 Zeilen mal richtig was zu programmieren ...

Sind nur 3 Zeilen 😀
 
dass das nicht geht hattes du ja schon gesagt, die Erkenntnis ging danach noch weiter,

also gut, dann exakt, ich meinte dies hier:
das umzuwandeln wäre dann jedenfalls eine richtige Rechenaufgabe, fertigen Code kennn ich dafür nicht,
nach \u suchen, die 4 Zeichen danach als String herausschneiden, hexadezimal parsen, die Zahl als char interpretiert
 
Wenn man ein Properties-File einliest (welches \u00E4 und ähnliches enthält), werden die Unicode-Zeichen automatisch umgewandelt. ???:L

Ich werde also versuchen den Weg über ein Properties-File zu gehen. :rtfm:

Trotzdem danke! :toll:

P.S. Sorry, aber ich glaube nicht, dass Hansa Meister wird :noe:
 
tatsächlich, hier der Quellcode dazu, nicht ganz 5 Zeilen 😉

Java:
    /*
     * Converts encoded \uxxxx to unicode chars
     * and changes special saved chars to their original forms
     */
    private String loadConvert (char[] in, int off, int len, char[] convtBuf) {
        if (convtBuf.length < len) {
            int newLen = len * 2;
            if (newLen < 0) {
	        newLen = Integer.MAX_VALUE;
	    } 
	    convtBuf = new char[newLen];
        }
        char aChar;
        char[] out = convtBuf; 
        int outLen = 0;
        int end = off + len;

        while (off < end) {
            aChar = in[off++];
            if (aChar == '\\') {
                aChar = in[off++];   
                if(aChar == 'u') {
                    // Read the xxxx
                    int value=0;
		    for (int i=0; i<4; i++) {
		        aChar = in[off++];  
		        switch (aChar) {
		          case '0': case '1': case '2': case '3': case '4':
		          case '5': case '6': case '7': case '8': case '9':
		             value = (value << 4) + aChar - '0';
			     break;
			  case 'a': case 'b': case 'c':
                          case 'd': case 'e': case 'f':
			     value = (value << 4) + 10 + aChar - 'a';
			     break;
			  case 'A': case 'B': case 'C':
                          case 'D': case 'E': case 'F':
			     value = (value << 4) + 10 + aChar - 'A';
			     break;
			  default:
                              throw new IllegalArgumentException(
                                           "Malformed \\uxxxx encoding.");
                        }
                     }
                    out[outLen++] = (char)value;
                } else {
                    if (aChar == 't') aChar = '\t'; 
                    else if (aChar == 'r') aChar = '\r';
                    else if (aChar == 'n') aChar = '\n';
                    else if (aChar == 'f') aChar = '\f'; 
                    out[outLen++] = aChar;
                }
            } else {
	        out[outLen++] = (char)aChar;
            }
        }
        return new String (out, 0, outLen);
    }
 

Zurück
Oben