Encoding Unicode Textfile

najjannaj

Aktives Mitglied
Hallo, ich habe folgende Textdatei:


input.txt
ben\u00f6tigt\r\nman eine Oberfl\u00e4che, m\u00f6chte aber nicht die \u00fcbliche

nun lese ich die Datei wie folgt ein:
Java:
FileInputStream fis = new FileInputStream("D:\\input2.txt");
		InputStreamReader isr = new InputStreamReader(fis, "UTF8");
		StringBuilder buffer = new StringBuilder();
		int c;
		while ((c = isr.read()) != -1) {
			buffer.append((char) c);
		}
		String str = buffer.toString();

Nun habe ich das Problem das die Zeichen \uXXXX nicht ersetzt werden. Wie kann ich diese Zeichen nun ersetzten? Ich habe einiges über Unicode gelesen, aber keine Lösung gefunden wie ich die Zeichen ersetzen kann.. `Hat jemand einen Tipp für mich? Ich weiß wenn ich new Character('\u00f6') erstelle, bekomme ich den Character den ich möchte. Das finden von \uXXXX in der Textdatei ist auch kein Problem. Aber einen String in ein Char zu wandeln ist leider nicht möglich. Jemand weitere Ideen?

Vielen Dank im vorraus!
 
Warum nicht. Muss man halt die Datei parsen und die \u Escape sequencen rausschnippeln.
Den char bekommst du so:

Java:
String s = "\u00f6";
char c = s.charAt(0);

EDIT: Denkfehler... s wäre ja "\\u00f6"... hmpf... Denke mal weiter
 
Zuletzt bearbeitet von einem Moderator:
So - jetzt aber...

Wenn du die escapten Strings hast, z.B. \\u00f6, schneidest du das \ ab und machst aus der hexamdecimal zahl ein int und daraus ein char:
Java:
String s ="00f6";
char c = (char)  Integer.parseInt(s, 16);
System.out.println(c);

Also das hier funktioniert soweit:
Java:
        FileInputStream fis = new FileInputStream("D:\\input2.txt");
		InputStreamReader isr = new InputStreamReader(fis, "UTF8");
		StringBuilder buffer = new StringBuilder();
		int c;
		while ((c = isr.read()) != -1) {
			buffer.append((char) c);
		}
		String str = buffer.toString();
		char[] chars = str.toCharArray();

		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < chars.length; i++) {
			if (chars[i] == '\\') {
				if (chars.length > i + 5 && chars[i + 1] == 'u') {
					try{
					    char x = (char) Integer.parseInt(str.substring(i+2, i+6), 16);
					    sb.append(x);
					    i = i + 5;
					} catch(NumberFormatException e){
					    //not a hex encoding
					    sb.append(chars[i]);
					}
				} else if (chars.length > i + 1 && chars[i + 1] == 'n') {
					sb.append('\n');
					i++;
				} else if (chars.length > i + 1 && chars[i + 1] == 'r') {
					sb.append('\r');
					i++;
				}  else {
					sb.append(chars[i]);
				}
			} else {
				sb.append(chars[i]);
			}
		}
		System.out.println(sb.toString());
 
Zuletzt bearbeitet von einem Moderator:
Danke fassy! Hat genau so fast geklappt. Leider hat er bei "Oberfl\u00e4che" bei \u00e4 ein 0xf1(BASIC_LATIN) Zeichen eingefügt. Gelöst habe ich es wie folgt...

Java:
try {
	// convert hex digit to a integer and cast to char
	char x = (char) Integer.parseInt(source.substring(i + 2, i + 6), 16);
	if (x != ((char) 31)) {
		sb.append(x);
	}
	i = i + 5;
} catch (NumberFormatException e) {

Leider hab ich keine Idee warum genau er das macht..

Vielen Dank nochmal!
 
Hmm, das kann ich nicht nachvollziehen.

Ich lade
ben\u00f6tigt\r\nman eine Oberfl\u00e4che, m\u00f6chte aber nicht die \u00fcbliche

Und bekomme raus:
man eine Oberfläche, möchte aber nicht die übliche

Exact mit dem Code den ich oben geposted habe. Was stellst du denn mit dem String weiter an? str.getBytes("UTF-8") sollte dir eigentlich nur UFT8 Bytes zurückgeben.
 

Zurück
Oben