# Probleme mit UTF-8 und properties



## Meru (16. Dez 2010)

Hallo Community,

ich habe ein kleines Problem mit dem Umwandeln von Sonderzeichen.
Wenn ich Strings in meinem Code habe, gehe ich mit ExternalizeStrings darüber und erstelle mir auf diese Weise die Property-Files. Anschließend benutze ich den ResourceBundleEditor um die Texte nachhaltig zu pflegen. Wenn ich bei dieser Pflege Umlaute wie ä eingebe, macht er automatisch ein UTF-8 Zeichen draus ( \u00E4 ). Greife ich nachher auf diese zu, erhalte ich auf meinen Labels das richtige Zeichen.


So, nun zu meinem Problem:
Ich habe nun mehrere messages.properties, welche ich nun in eine CSV übertragen will, damit ein "Kunde" sich eine eigene Sprache hinzufuegen kann. Es soll also in einer csv zusammengefasst werden (die PackageStruktur zu den Keys merke ich mir natürlich).
Nun passiert folgendes:
Ich lese die Datei zeilenweise ein und in machen Zeilen ist ein Umlaut enthalten. Will ich mir diese Line ausgeben lassen, steht auf meiner console das codierte UTF-8 Zeichen, aber leider nicht der eigentliche Umlaut.
Erstelle ich im Programm manuell einen String mit einer UTF-8 Kodierung funktioniert es


```
String line; // konmmt aus dem BufferedReader

PrintStream sysout = new PrintStream(System.out, true, "UTF-8");
sysout.println(line); // Ausgabe -> enth\u00E4lt
sysout.println("enth\u00E4lt"); // Ausgabe -> enthält
```

Was mir auch aufgefallen ist:

```
String line; // konmmt aus dem BufferedReader

String tmp = "enth\u00E4lt";

line.lenght(); // 12
tmp.length(); // 7
```



Zum einlesen verwende ich folgendes

```
Reader reader 		= new InputStreamReader(new FileInputStream(messageFile),"UTF-8");
BufferedReader br 	= new BufferedReader(reader);

String line = null;
while((line= br.readLine())!=null) {
	// .....
}
br.close();
reader.close();
```


Was kann ich da machen?


----------



## SlaterB (16. Dez 2010)

wenn du \u00E4 in Java-Quelltext-Strings schreibst, dann wandelt der Compiler das in einen Umlaut um, 
so wie er aus \n einen Zeilenumbruch macht,

schreibst du dagegen \n oder eben \u00E4 in eine Textdatei, dann ist das eine beliebige Anreihung von 2 bzw. 6 Zeichen,
kein Standard-Stream der Welt wird dir diese automatisch umwandeln, das hat nichts mit Encoding zu tun,

nur der Java-Compiler oder ähnliche spezielle Tools verarbeiten das vielleicht (ich kann dir allerdings keins nennen), oder du selber manuell:
du musst nach \u suchen, die 4 Hexa-Ziffern danach herausscheiden, zu einem int parsen, das auf char gecastet ist ein schönes Zeichen


----------



## Gast2 (16. Dez 2010)

SlaterB hat gesagt.:


> du musst nach \u suchen, die 4 Hexa-Ziffern danach herausscheiden, zu einem int parsen, das auf char gecastet ist ein schönes Zeichen



Den fast fertigen Code dazu gibt es auch schon hier:
http://www.java-forum.org/allgemeine-java-themen/96086-encoding-unicode-textfile.html#post610704


----------



## Meru (16. Dez 2010)

Danke fuer eure Tipps. 
So etwas in der Richtung habe ich mir schon gedacht, als ich das mit den 12/7 Zeichen gesehen habe. Nur wusste ich halt nicht, was ich dagegen machen kann und klammerte mich an die Hoffnung, dass ich vielleicht etwas falsch einlese oder dergleichen .

Die vorgestellte Lösung sieht vielversprechend aus und werde das morgen dann gleich mal testen.

Soweit erst einmal vielen herzlichen Dank.


----------



## Meru (20. Dez 2010)

Also das hat alles super funktioniert, danke nochmals.

Jetzt habe ich das Problem, wie ich das wieder rückwarts machen kann. Nun steht in der Excel-Datei alles schön drin, aber ich muss aus den Zeichen wieder \u.... machen :/  . Weiß jemand was da zu machen ist? Kenne mich leider nicht wirklich mit der ganzen Geschichte aus.

Gruß Meru


----------



## SlaterB (20. Dez 2010)

technisch ist es ja offensichtlich derselbe Weg zurück, char auf int casten, zu Hexstring formatieren \u davor usw.,
du musst dann noch entscheiden, welche chars das betrifft, 
einzelne wichtige wie Umlaute benennen, ansonsten noch alle über int-Wert 256 oder so,

fertiges Tool wäre schön, kann keins nennen


----------



## Meru (20. Dez 2010)

Geb ich dir natürlich recht, mir hat nur der konkrte Denkanstoß gefehlt.

Also soweit ich das testen konnte, scheint das ganz gut zu funktionieren.

```
private String stringToPlainUnicode(String str){
		String retVal = "";
		
		char[] charArr = str.toCharArray();
		
		for (Character c : charArr){			
			if (c < 32 || c > 127){
				String hex = Integer.toHexString(c);
				if (hex.length() <= 4 ){
					switch (hex.length()) { // je nach laenge die 0en auffüllen
						case 1: hex = "000" + hex; break;
						case 2: hex = "00" + hex; break;
						case 3: hex = "0" + hex; break;
						case 4: hex = "" + hex; break;
						default:break;
					}	
				}
				retVal += "\\u"+hex;
			}else{
				retVal += c; // normales Zeichen, welches nicht umgewandelt werden musste
			}
		}		
		return retVal;
	}
```

Danke nochmals


----------

