# unicode-zeichen in ein txt-File schreiben



## lfshaker (10. Jan 2008)

Hallo zusammen 

ich hab ein folgendes Problem. Ich möchte chemische Formeln in ein txt-File schreiben.
hier der code:


```
import java.io.*;
import java.util.*;
import java.text.*;

public class ProtocolWriter {

	private String fileName;
	private final String space = "	-	";
	private File file;
	private BufferedWriter writer;
	
	
	public ProtocolWriter(){
			
		fileName = "D:/protocol.txt";
		
		file = new File(fileName );
		
		try{
			
			writer = new BufferedWriter(new FileWriter(file));
		}
		catch(IOException ex){
		
			
		}
	}
	
	public void writeLineToProtocolFile(String sumFormula){
		
		try{
		
			writer.write(sumFormula + "\r\n");
			writer.flush();
		}
		catch(IOException ex){
		
		}
	}
}
```

Der Methode "writeLineToProtoclFile" wird z.B. "H2SO4" (die 2 und die 4 sind unicodezeichen und tiefgestellt - wird hier nicht dargestellt)... 

Im Textfile finde ich den Eintrag aber folgend: "H?SO?".

Die unicode-Zeichen werden durch "?" ersetzt...
Hat jemand eine Ahnung, woran das liegen kann?

Danke für eure Hilfe.


----------



## SlaterB (10. Jan 2008)

du musst die Datei im passenden Encoding schreiben (und später auch lesen, kann nicht jeder simple Editor)

FileWriter ist schlecht:


> public class FileWriter
> extends OutputStreamWriter
> 
> Convenience class for writing character files. The constructors of this class assume that the default character encoding and the default byte-buffer size are acceptable.



OutputStreamWriter vielleicht:
http://java.sun.com/javase/6/docs/api/java/io/OutputStreamWriter.html

aber bei solchen Geschichten würde ich ein kompetentes Tutorial konsultieren,
(in kann keins nennen und auch nicht mehr helfen als auf die Problematik hinzuweisen  )


----------



## Bernd das Brot (10. Jan 2008)

Alternativ nimmst Du einen outputstream, in welchen man Bytes schreiben kann und konvertierst selbst:


```
String uff = "²³";
byte[] buffer = uff.getBytes("iso-8859-15");
```

Da gibt es aber ein echtes Problem: wenn die Plattform die Zeichen nicht darstellen kann (und FileWriter verwendet bereits das Plattformencoding), dann bringt das alles nix.

Also würde ich vielleicht einfach keine lesbare Datei nehmen, sondern alternativ den String z.B. mit dem ObjectOutputStream deserialisieren. Das wäre eine echte Brot und Butter-Lösung - wenn Du nur wegspeichern willst.

Alternative 2 (luxus): XML. Dort kannst Du im Kopf das encoding angeben - also z.B. UTF-8 oder UTF-16.

Ich denke da an sowas der Art:


```
<?xml version="1.0" encoding="UTF-8"?>
<formular>
     [HIER DEINE FORMEL ALS TEXT]
</formular>
```

Dazu mußt Du Dich mal in javax.xml.* einlesen. Aber ausgeben kannst Du das dann z.B. mit


```
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
transformer.setOutputProperty(OutputKeys.ENCODING, encoding);
// Einrückung: wer keine Formatierung braucht, kann darauf verzichten
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", indent+"");

// wechschreiben
transformer.transform(new DOMSource(doc), new StreamResult(new BufferedWriter(new OutputStreamWriter(ostream, encoding))));
```

Angenommen werden ein gültiges XML-Document doc und ein fertiger OutputStream ostream inklusive gewünschtem encoding


----------



## lfshaker (10. Jan 2008)

danke für eure Antworten. habs folgendermassen gelöst:


```
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));
```

mit dem OutputStreamWriter verkettet mit dem FileOutputStream und der "UTF-8"-Kodierung hat es geklappt...


Danke nochmals an SlaterB für den Tipp mit dem FileWriter ;-)


----------

