2011-05-11 98 views
11

我一直對Unicode的閱讀起來,UTF-8編碼不顯示了一段時間,我想我明白了,所以希望這不會是一個愚蠢的問題:UTF-8 CJK字符在Java中

我有一個包含一些CJK字符的文件,並且已經保存爲UTF-8。我安裝了各種亞洲語言包,其他應用程序也能正確顯示字符,所以我知道這很有用。

在我的Java應用程序,我讀的文件如下:

// Create objects 
fis = new FileInputStream(new File("xyz.sgf")); 
InputStreamReader is = new InputStreamReader(fis, Charset.forName("UTF-8")); 
BufferedReader br = new BufferedReader(is); 

// Read and display file contents 
StringBuffer sb = new StringBuffer(); 
String line; 
while ((line = br.readLine()) != null) { 
    sb.append(line); 
} 
System.out.println(sb); 

輸出顯示CJK字符爲 '???'。撥打is.getEncoding()確認它確實使用UTF-8。我錯過了什麼步驟才能使角色正確顯示?如果它有所作爲,我正在使用Eclipse控制檯查看輸出。

+0

什麼是您正在使用的IDE(Netbeans,Eclipse等)? – Abdelwahed 2011-05-11 14:02:56

+0

@Abdelwahed Eclipse(Helios) – Twicetimes 2011-05-11 14:07:15

+1

我之前用阿拉伯字符試過,而我遇到同樣的問題。但是當我放了一個喙點並檢查了字符串時,我發現字符串正確顯示。我將它打印在一個文件中,並且沒問題。 – Abdelwahed 2011-05-11 14:13:41

回答

15
System.out.println(sb); 

的問題是上述線路中解釋。這將使用默認系統編碼對字符數據進行編碼並將數據發送到STDOUT。在許多系統上,這是一個有損耗的過程。

如果更改默認值,System.out使用的編碼和控制檯使用的編碼必須匹配。

更改默認系統編碼的唯一支持機制是通過操作系統。 (有些人會建議使用file.encoding系統屬性,但是這是not supported,可能會產生意想不到的副作用。)您可以使用setOut到自己的自定義PrintStream

PrintStream stdout = new PrintStream(System.out, autoFlush, encoding); 

您可以更改通過Eclipse控制檯編碼Run configuration

你可以在我的博客上找到許多關於這個主題的文章 - 通過我的個人資料。

+1

非常豐富,謝謝。不幸的是,由於我的聲譽不夠高,我無法投票回答這個問題。 – Twicetimes 2011-05-11 14:31:36

+1

我已經改變了運行配置以使用UTF-8,並且我強制定製了PrintStream,如下所示:'PrintStream utfout = new PrintStream(System.out,false,「UTF-8」); System.setOut(utfout);',但這些字符在Eclipse控制檯窗口中仍然無法正確顯示。奇怪的是,他們已經從顯示爲'?'而是一個方塊,所以發生了一些事情。只是不知道是什麼。 – Twicetimes 2011-05-11 14:42:02

+2

@Twicetimes - 這實際上更好,但這是它可以變得棘手的地方。在我的系統中,儘管使用不支持中文字形的_Courier New_,字體替換用於渲染中文字符串。我相信Windows上的SWT使用Uniscribe,因此您可能需要閱讀Win32 API以瞭解這是如何發生的。您可能只是沒有安裝正確的字體組合。您可以[切換字體](http://help.eclipse.org/helios/topic/org.eclipse.platform.doc.user/reference/ref-fonts.htm)爲代碼點[支持]( http://en.wikipedia.org/wiki/Character_Map)。 – McDowell 2011-05-11 15:32:52

2

根據您的平臺,控制檯(或Windows CMD)很可能不支持或使用UTF-8字符集,因此將所有無法映射的字符轉換爲問號。

在Windows上,例如CMD幾乎總是使用WIN1252或類似的單字節字符集。

+0

是的,我不希望Windows cmd正確顯示它們,但我認爲Eclipse會有。如果這確實是問題的根源,那麼其他人是否可以驗證Eclipse是否在其控制檯中正確顯示某些Unicode字符?我還可以在哪裏顯示程序的輸出以測試程序是否正常工作? – Twicetimes 2011-05-11 13:58:00

+1

@Twicetimes:將輸出傳輸到文件並使用支持UTF-8的編輯器打開該文件。 – 2011-05-11 14:03:05

+0

@ChristofferHammarström - 感謝您的建議。我使用帶有指定的UTF-8字符集的OutputStreamWriter將字符串直接寫回到文件中,並且生成的文件在另一個應用程序中正確顯示字符,所以我想一切都很好。必須是拋出我的Eclipse控制檯。 – Twicetimes 2011-05-11 14:20:42

4

以下程序使用TextPad將CJK字符打印到控制檯。要查看韓文和日文平假名,我不得不告訴Java打印流的編碼改爲EUC_KR並設置TextPad的工具輸出窗口的屬性:

  • 字體是宋體的Unicode MS
  • 腳本是朝鮮語

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

class Hangul { 

    public static void main(String[] args) throws Exception { 

     // Change console encoding to Korean 

     PrintStream out = new PrintStream(System.out, true, "EUC_KR"); 
     System.setOut(out); 

     // Print sample to console 

     String go_hello = "가다 こんにちは"; 
     System.out.println(go_hello); 
    } 
} 

工具的輸出是:

加入我的收藏夾