hallo,
ich lasse Dateien ausführen und die Ausgaben in eine Datei umlenken. Leider werden die Umlaute etc nicht korrekt dargestellt. Welchen Fehler habe ich gemacht?
command ist cmd.exe /C
final Process p = Runtime.getRuntime().exec(command + file);
...
StringBuffer sb = new StringBuffer();
BuffererReader br = new
BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedReader br\_error = new
BufferedReader(newInputStreamReader(p.getErrorStream()));
// Ausgabestrom zwischenspeichern
while ((line = br.readLine()) != null)
{
System.out.println(line); --\> hier werden schon keine Umlaute dargestellt!
}
...
RandomAccessFile file = new RandomAccessFile(fileName, "rw");
Writer out = new OutputStreamWriter
(new FileOutputStream(file.getFD()), "UTF-8");
file.seek(file.length());
out.append(sb.toString()+System.getProperty("line.separator"));
out.flush();
file.close();
Ideen???
Steffi
Moin
Welchen Fehler habe ich gemacht?
Falsches Encoding. Da es windoof ist müsste es „windows-1252“ sein:
BuffererReader br = new
BufferedReader(new InputStreamReader(p.getInputStream(),"windows-1252"));
Ohne Garantie.
cu
moin
nee, auch das klappt nicht. Wird immer noch ein „Datentr„ger“ draus.
ausserdem soll es ja betriebssystemunabhängig sein.
Falsches Encoding. Da es windoof ist müsste es „windows-1252“
sein:
BuffererReader br = new
BufferedReader(new
InputStreamReader(p.getInputStream(),„windows-1252“));
Moin
nee, auch das klappt nicht. Wird immer noch ein „Datentr„ger“
draus.
Da hilft nur die üblichen Verdächtigen durchtesten. Fang bei ASCII an.
ausserdem soll es ja betriebssystemunabhängig sein.
Dann arbeite um Himmelswillen nicht mit cmd. cmd reagiert je nach installierter Windows-Sprache anders.
cu
Da hilft nur die üblichen Verdächtigen durchtesten. Fang bei
ASCII an.
oje, das kann was werden
ausserdem soll es ja betriebssystemunabhängig sein.
Dann arbeite um Himmelswillen nicht mit cmd. cmd reagiert je
nach installierter Windows-Sprache anders.
das war ja auch nur das Beispiel für windows. die endung ist BS-spezifisch.
selbst bei diesem simplen Beispiel geht es nicht:
public static void main(String[] args) {
String encoding = System.getProperty("file.encoding");
try {
Process p =
Runtime.getRuntime().exec("cmd.exe /c dir c:");
BufferedReader br = new BufferedReader(
new InputStreamReader(p.getInputStream(),encoding));
for(String s; (s=br.readLine()) != null:wink:
System.out.println(s);
}
catch(Exception e){}
}
Spät aber doch - Eine Lösung für M$ cmd.exe
Hi -
Du hast leider einen üblichen Verdächtigen vergessen: Die Microsoft cmd Shell und Ihre abwärtskompatibilität zu DOS.
Leider hilft dir hir die System - file.encoding - Eigenschaft nicht weiter, da diese nicht für diese DOS-Console gilt, die ja kompatibel sein muß und desshalb voreingestellt Cp850 als Encoding hernimmt.
Das ist auch schon die Lösung (+ ein paar gemeine Nebensachen):
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.PrintWriter;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
public class Encoding extends Object {
public static void main(String[] args) {
String encoding = System.getProperty("file.encoding");
try {
Process p = Runtime.getRuntime().exec("cmd.exe /c dir c:");
// Auch die Input Daten aus dem standard.in kommen in Cp850
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream(), "Cp850"));
// Leider ist System.out nicht I18N-Fähig
// Wir nehmen einen Standard java.io.PrintWriter
PrintWriter printWriter = null;
try {
// Diesem muß das Encoding Cp850 auch mitgegeben werden
printWriter = new PrintWriter(new OutputStreamWriter(System.out, "Cp850"));
} catch (UnsupportedEncodingException ex) {
System.err.println(ex);
System.exit(0);
}
// Jetzt funzt das
for (String s; (s=br.readLine()) != null:wink: {
printWriter.println(s);
}
// Nicht vergessen - Sauber programmieren
printWriter.flush();
printWriter.close();
} catch (Exception e) {
// Hier sollte eigentlich auch was rein
}
}
}
Leider mußt du auch noch einen eigenen PrintWriter aufmachen, da sich System.out (Ein Überbleibsel aus JSE 1.0) einen feuchten Dreck um Encodings schert (und auch leider nicht als deprecated gekennzeichnet wurde). Dh. Du mußt dir einen I18N-konformen java.io.PrintWriter mit Cp850 Encoding aufmachen - In den kannst du schreiben.
Soviel dazu, ein Betriebsystemunabhängiges Programm zu schreiben - Leider kann jede Shell (ob DOS, Windows, Linux, etc) einen anderen Zeichensatz eingestellt haben, als das System auf der sie läuft.
Desswegen kannst bzw. mußt du bei den meisten Shell-Emulatoren auch selber auswählen, welcher Zeichensatz bei der Anzeige verwendet werden soll.
selbst bei diesem simplen Beispiel geht es nicht:
Leider geht das Simple Beispiel davon aus, dass System.out I18N-fähig ist - Ist es leider nicht.
mfG,
J.P.Jarolim