# Unicode: cmd parameter (main args); exec params; filenames



## jdev (13. Okt 2008)

Hallo zusammen,

Java nennt sich ja "unicode ready". Das ist jedoch nur relativ easy solange ich innerhalb der JVM bleibe.
An den Schnittstellen zur Shell (main/exec) wird's schwieriger.
Leider hab ich nach langem Google-Recherchieren noch keine aussagekräftigen bzw. zuverlässigen Ergebnisse bekommen.
Wär toll wenn Ihr mit bei diesen Fragen weiterhelfen könnt:

Eine Java Applikation muss internationale Zeichen (nicht nur ISO-8859) handhaben können:
1.)  in command line parametern für die Java Applikation
- ist main() überhaupt 16 bit (vgl. C++ wmain)?
Mit shell meine ich cmd.exe (ab Win XP Prof.).
Die Codepage der Windows cmd Konsole stelle ich auf Unicode um:
chcp 65001
Beim Aufruf

java -Dfile.encoding=UTF-8 UnicodeTests äöüß€éáç©®

kann ich diese Zeichen auch wieder in der cmd ausgeben und sehe sie korrekt.
Was nun unklar ist: ich hab hier nur ISO8859-1-Zeichen bzw. Windows-1252. 
Was ist z. B. bei einem Chinesischen Windows, wo man nicht alle Zeichen in einem Byte unterbringen kann? 
Kann die cmd shell überhaupt mehr als ein byte pro Zeichen an die Java-main übergeben???
Ich nehme an, durch codepage-Umschaltung (chcp) kann nur auf ein anderes 1-Byte-Fenster innerhalb des Unicode-Umfangs umschalten (???)
Welchen workaround gäbe es?

2.) internationale Zeichen in Parametern für zu startende externe Programme (exex / ProcessBuilder):
Was muss ich beachten wenn ich aus Java ein externes Programm starte und diesem Unicode-Parameters mitgeben will?

Schließlich: wie muss ich Files mit Unicode-Zeichen (oder anderen Encodings) im Filename handhaben?
Mit welchem encoding arbeitet File(String pathname), File.list() ?

Vielen Dank für Eure Beiträge!

Gruß, Robert


----------



## FArt (13. Okt 2008)

Eigentlich ist die Sache relativ einfach:
wenn das Betriebsystem (besser: die Shell) und die Java Applikation gleichzeitig mit dem gleichen Encoding bzw. mit den gleichen Ländereinstellungen arbeiten, dann gibt es keine Probleme bei den angesprochenen Berühungspunkten (Schnittstellen).

Die Einstellungen des Rechners sind irrelevant, sofern sie von Java überschrieben werden und die Schnittstellen das entsprechend berücksichtigen, z.B. beim Einlesen von Dateien, die ja unterschiedlichste Encodings mitbringen können.


----------



## jdev (13. Okt 2008)

Wie Du schon sagst - eigentlich. Soweit die Theorie. In der Praxis schaut's so aus: cmd arbeitet standardmäßig mit codepage 850. Ich kann nicht die VM generell auf file.encoding=cp850 stellen, sonst arbeiten System.out (und andere IO) nicht mehr mit UTF. Wie könnte ich also einen exec-call / ProcessBuilder realisieren? Müsste ich meinen UTF16-String (command parameter) JVM intern umkodieren um ihn als args-Array-Element für ProcessBuilder reinzugeben?


----------

