2016-06-26 10 views
0

Ich versuche, das Unicode block character in einer Java-Anwendung zu drucken, die in Cygwin ausgeführt wird. Obwohl das Terminal auf UTF-8 eingestellt ist und trotz Bash und Python das Zeichen drucken kann, druckt Java einfach ?.Java kann keine Unicode-Zeichen anzeigen, obwohl das Terminal ordnungsgemäß konfiguriert ist

$ echo $LANG 
en_US.UTF-8 

$ echo -e "\xe2\x96\x88" 
█ 

$ python3 -c 'print("\u2588")' 
█ 

$ cat Block.java 
public class Block { 
    public static void main(String[] args) { 
    System.out.println('\u2588'); 
    } 
} 

$ javac Block.java 

$ java -cp . Block 
? 

Dies erscheint als Cygwin spezifisch zu sein, wenn sie von cmd das Zeichen laufen angezeigt:

>java -cp . Block 
█ 

Gibt es etwas, was ich tun kann Cygwin/mintty zu machen Java korrekt ausgegeben zu bekommen?

aktualisieren:

Es scheint Java auf Windows/Cygwin verwendet nicht tatsächlich die LANG Umgebungsvariable, und ist daher nach wie vor eigentlich cp1252 mit:

$ cat Block.java 
public class Block { 
    public static void main(String[] args) { 
    System.out.println("Default Charset=" + java.nio.charset.Charset.defaultCharset()); 
    System.out.println("\u2588"); 
    } 
} 

$ java -cp . Block 
Default Charset=windows-1252 
? 

Aber seltsam kann ich nicht erhalten iconv zu arbeiten:

$ java -cp . Block | iconv -f WINDOWS-1252 -t UTF8 
Default Charset=windows-1252 
? 

Antwort

0

Soweit ich sagen kann, es gibt keinen Wegzu bekommen, um Cygwins Zeichensatz zu berücksichtigen, da Java unter Windows keine Umgebungsvariablen verwendet, um die Standardcodierung zu bestimmen.

Sie können JAVA_TOOL_OPTIONS Nutty zum java Aufruf dynamisch hinzuzufügen, jedoch führt dies java Debug-Informationen zu drucken, die ich lieber nicht haben.

$ JAVA_TOOL_OPTIONS='-Dfile.encoding=UTF-8' java -cp . Block 
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 
Default Charset=UTF-8 
█ 

Eine weitere Option ist Aliase zu verwenden:

alias javac='javac -encoding UTF-8' 
alias java='java -Dfile.encoding=UTF-8' 

Welche für die interaktive Nutzung gut genug funktioniert.

+0

'iconv' wird nicht helfen, weil' █' in erster Linie nicht in Windows-1252 codiert werden kann (und java wird '' 'stattdessen drucken) – roeland

+0

@roeland Warum wird es dann korrekt von einem (windows-1252) cmd Eingabeaufforderung? – dimo414

+1

Da einige Programme Windows-spezifische Funktionen zum Drucken von Text verwenden. Unabhängig von Ihrer Codepage kann 'WriteConsoleW (...)' beispielsweise beliebigen Unicode-Text auf der Konsole ausgeben. – roeland