2010-03-10 64 views
16

我有一個程序在控制檯上運行,它的變音和其他特殊字符正在Mac上輸出。這裏有一個簡單的測試程序:Java:如何檢測(並更改?)System.console的編碼?

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

在默認的Mac控制檯(默認UTF-8編碼),這個打印:

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

但經過手動設置的Mac終端的編碼「的Mac OS羅馬」,它打印正確

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

注意在使用System.console()Windows系統的工作原理:

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

那麼我該如何製作我的程序... rolleyes ...「無處不在」?

回答

8

Epaga:看看右邊here。您可以在輸出流中設置輸出編碼 - 只需確定或確定要設置哪個編碼即可。

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); 
    } 
} 

要確定編碼你可以使用系統命令「區域設置」,並解析其控制檯輸出 - 在德國UTF-8系統的樣子:

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個問題:1)我怎麼知道哪種編碼在控制檯設置? 2)有什麼辦法仍然可以使用System.console()? – Epaga 2010-03-10 09:27:43

+0

不,你不能使用'System.console()'保留你的代碼,並且我不認爲它是關鍵的。 'PrintStream'也擁有你想要的所有東西,它*可以正常工作。 +1爲我的答案。 – dimitarvp 2010-03-10 09:35:23

+0

1)您可以使用系統命令「locale」並解析其輸出。 – gamma 2010-03-10 09:36:39

12

試試下面的命令行啓動應用程序時的說法:

-Dfile.encoding=utf-8

這改變了JVM的默認編碼爲I/O操作。

你還可以嘗試:

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

問題在於,我將這個控制檯程序作爲jar發佈,所以我正在尋找一種不涉及用戶必須添加自己的命令行參數的解決方案。 – Epaga 2010-03-10 09:26:34

+1

@Epaga - 使用bat文件或jar包的一些包裝? – Bozho 2010-03-10 09:42:56

+1

-Dfile.encoding = utf-8不是標準選項,應該避免。 – n0rm1e 2011-11-18 04:10:18