2010-03-10 5 views
16

Ich habe ein Programm, das auf einer Konsole läuft und dessen Umlaute und andere Sonderzeichen ausgegeben werden als auf Macs. Hier ist ein einfaches Testprogramm:Java: Wie erkennt man (und ändert?) Die Kodierung von System.console?

public static void main(String[] args) { 
    System.out.println("höhößüä"); 
    System.console().printf("höhößüä"); 
} 

Auf einer Standard-Mac-Konsole (mit Standard-UTF-8-Kodierung), dieser Druck:

h?h???? 
h?h???? 

Aber nachdem manuell der Mac Terminals Codierung auf „Mac OS Roman “, es richtig gedruckt

höhößüä 
höhößüä 

Beachten sie, dass auf Windows-Systemen mit System.Console() funktioniert:

h÷h÷▀³õ 
höhößüä 

Also wie mache ich mein Programm ... rolleyes ... "run everywhere"?

Antwort

8

Epaga: Schauen Sie genau hin here. Sie können die Ausgabecodierung in einem Druckstrom einstellen - müssen Sie nur bestimmen oder absolut sicher sein, was eingestellt wird.

import java.io.PrintStream; 
import java.io.UnsupportedEncodingException; 

public class Test { 
    public static void main (String[] argv) throws UnsupportedEncodingException { 
    String unicodeMessage = 
    "\u7686\u3055\u3093\u3001\u3053\u3093\u306b\u3061\u306f"; 

    PrintStream out = new PrintStream(System.out, true, "UTF-8"); 
    out.println(unicodeMessage); 
    } 
} 

die Konsole Um zu bestimmen, kodieren Sie den Systembefehl „locale“ und analysieren die Ausgabe verwenden könnte, die - auf ein Deutsch UTF-8-System wie folgt aussieht:

LANG="de_DE.UTF-8" 
LC_COLLATE="de_DE.UTF-8" 
LC_CTYPE="de_DE.UTF-8" 
LC_MESSAGES="de_DE.UTF-8" 
LC_MONETARY="de_DE.UTF-8" 
LC_NUMERIC="de_DE.UTF-8" 
LC_TIME="de_DE.UTF-8" 
LC_ALL= 
+0

2 Probleme: 1) Wie kann ich wissen, welche Kodierung in der Konsole festgelegt ist? 2) Gibt es eine Möglichkeit, immer noch mit System.console() zu arbeiten? – Epaga

+0

Nein, Sie können Ihren Code nicht mit 'System.console()' speichern, und ich empfinde das nicht als kritisch. "PrintStream" hat auch alles, was Sie wollen und es funktioniert * richtig *. +1 für die Antwort von mir. – dimitarvp

+0

1) Sie könnten den Systembefehl "locale" verwenden und seine Ausgabe parsen. – gamma

12

die folgende Befehlszeile Versuchen Argument beim Start der Anwendung:

-Dfile.encoding=utf-8

Dies ändert die Standard-Kodierung der JVM für I/O-Operationen.

Sie können auch versuchen:

System.setOut(new PrintStream(System.out, true, "utf-8")); 
+1

Problem mit diesem ist, dass ich dieses Konsolenprogramm als jar verschicke, also suche ich nach einer Lösung, die den Benutzer nicht einschließt, seine eigenen Befehlszeilenargumente hinzuzufügen. – Epaga

+1

@Epaga - Verwenden Sie eine Fledermaus-Datei oder ein Wrapper für das Glas? – Bozho

+1

-Dfile.encoding = utf-8 ist keine Standardoption und sollte vermieden werden. – n0rm1e

Verwandte Themen