Zeichensatz ändern

MScalli

Erfahrenes Mitglied
Hi Leutz..

Ich hab da ein Problem und komm einfach net weiter.
Ich versuche eine Textdatei einzulesen und diese in einem anderen Zeichensatz zu speichern.
Sinn ist es (zwecks nem alten drucker) Umlaute zu auszutauschen..

heisst z.B. aus nem Ä soll ein 'Ž' werden usw.

Hier mal mein code der mit nem normalen String einwandfrei funktioniert.
Um es euch so einfach wie möglich zu machen als ausführbares Programm

Code:
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;


public class ConvertZeichensatz {

	ConvertZeichensatz(){
		
		String data = "";
		
		data = "Ää Öö Üü ß\r\n";
		
		OutputStream out;
		try {
			
			out = new FileOutputStream("C:\\Temp\\Test_Zeichensatz.txt");
			OutputStreamWriter docWriter=new OutputStreamWriter(out,"CP437");
			docWriter.write(data);
			docWriter.close();
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
	}
	public static void main(String[] args) {
	
		new ConvertZeichensatz();
	}
}

Die Datei wird erstellt und sollte so aussehen
Ž„ ™” š á


soweit so gut..
mein Problem ist nur das die Textdatei die ich habe zwar allem anschein alles richtig anzeigt aber wenn ich ein System.out.println() mache wird mir das 'Ä' so 'Ä' dargestellt.
Und das wird dann in dieser Form convertiert.. 'Ä' wird zu '****'

Hier mal der Code mit dem einlesen der Datei..
natürlich ebenfalls ausführbar
Code:
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;


public class ConvertZeichensatz {

	ConvertZeichensatz(){
		
		String data = "";
		
	    FileReader fr;
		try {
			fr = new FileReader("c:\\Temp\\test.dat");
		    BufferedReader br = new BufferedReader(fr);

		    String zeile = "";

		    while( (zeile = br.readLine()) != null )
		    {
		      System.out.println(zeile);
		      data += zeile + "\r\n";
		    }

		    br.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		//data = "Ää Öö Üü ß\r\n";
		
		OutputStream out;
		try {
			
			out = new FileOutputStream("C:\\Temp\\Test_Zeichensatz.txt");
			OutputStreamWriter docWriter=new OutputStreamWriter(out,"CP437");
			docWriter.write(data);
			docWriter.close();
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
	}
	public static void main(String[] args) {
	
		new ConvertZeichensatz();
	}
}

plz HELP
 

Anhänge

Hallo,

Generell solltest du wissen, dass Java immer das System-default-charset benutzt, sollte kein anderes angegeben worden sein.

Ich erkenne, dass bei dir beim Einlesen eben nur das Standardcharset benutzt wird, denn readLine() spuckt einen String aus, der mit dem Defaultcharset encoded wurde...

Ich selbst benutze da oft die Klasse "Scanner" bei der man dem Konstruktor ein Charset Objekt übergeben kann.

http://download-llnw.oracle.com/javase/6/docs/api/java/util/Scanner.html

Scanner(File source, String charsetName) oder
Scanner(InputStream source, String charsetName)

Mit dem Scanner kann man bequem Textdateien Zeile für Zeile auslesen...


Sollte der Inhalt jetzt mit dem richtigen Encoding vorliegen, dann kann es auch sein, dass deine Ausgabekonsole selbst ein anderes Charset benutzt.

Da lässt sich als Beispiel die Eclipse-konsole nennen.

Gruß,
Martin

PS

Statt dem Scanner gibt es soweit ich weiß noch andere Streams bei denen man das Encoding beeinflussen kann.
 
Zuletzt bearbeitet:
Vielen dank das du dich mit meinem Problem auseinandergesetzt hast obwohl es wirklich viel zu lesen war..
Dein tipp mit der Klasse Scanner war genial!
Hab diese Methode zum Lesen gleich in meine File Klasse übernommen :)

Und nun für die leutz die auch mal in diese Lage geraten ne ausführliche Lösung

Code:
    public static String readFileWithCharset(String path_file, String charset)
    {
    	String text = "";
		
		FileInputStream wordStream;
		try {
			
			wordStream = new FileInputStream( path_file );
			Scanner wordScanner = new Scanner( wordStream, charset );

			while( wordScanner.hasNextLine() ){ 
				
				text += wordScanner.nextLine() + "\r\n"; 
			}
			
		} catch (FileNotFoundException e) {
			JOptionPane.showMessageDialog(null, "Fehler MyFile.readFileWithCharset() " + path_file.toString() , null, 2);
			e.printStackTrace();
		}
		return text; 
    }

Code:
    public static boolean createFileWithCharset(String path_complete, String data, String charset) 
    {
        boolean retVal = false;
		OutputStream out;
		try {
			
			out = new FileOutputStream(path_complete);
			OutputStreamWriter docWriter = new OutputStreamWriter(out, charset);
			docWriter.write(data);
			docWriter.close();
			
		} catch (Exception e) {
			JOptionPane.showMessageDialog(null, "Fehler MyFile.createFileWithCharset() " + path_complete.toString() , null, 2);
			e.printStackTrace();
		}
        return retVal;
    }

und der Aufruf(die Methoden befinden sich in der Klasse MyFile)

MyFile.createFileWithCharset(path_txt, MyFile.readFileWithCharset(path_txt, "UTF-8"), "CP437");

Es wird hier keine neue Datei erstellt sondern die alte gleich überschrieben

und noch mal 1000 dank mccae
 
Zurück