2012-01-19 15 views
0

在我的包,我想顯示UTF-8字符,我想我的默認字符集是CP1250和奇怪的現象發生了:OSGi包不顯示UTF-8字符

public class Activator implements BundleActivator { 

    public void start(BundleContext context) throws Exception { 
     System.out.println("ąśżłóę"); // this is what should've been displayed 
     System.out.println("������"); // this is the utf8 above encoded to cp1250 
    } 

    public void stop(BundleContext context) throws Exception { 
    } 

    public static void main(String args[]){ 
     System.out.println("ąśżłóę"); //utf-8 
     System.out.println("������"); //cp1250 
    } 
} 

輸出,當我運行主,我得到了我的預期:

ąśżłóę 
ąśżłóę 

輸出,當我開始從一個OSGi框架捆綁包,字符從UTF-8編碼爲CP1250。所以輸出完全相反。

ąśżłóę 
ąęźł 

所以我的問題是:如何處理它?我應該用cp1250而不是utf-8編寫應用程序嗎?或者是否有可能更改osgi默認字符集?

+0

你的開發環境是什麼?該包是否使用與非osgi代碼相同的進程構建? –

回答

2

AFAIK OSGi對默認字符集不做任何事情。這聽起來像是你從IDE運行了一個測試,它給出了正確的結果,但是當OSGi框架啓動時,JVM從OS默認值(windows?)獲取字符集。

-Dfile.encoding=UTF-8啓動框架(詳細信息見this answer

3

的幾個注意事項:

  • 當編譯Java源文件,確保您的compiler encoding編輯器的編碼相匹配(通常不是一個問題在IDE)
  • 在運行時,Java字符串始終是UTF-16(類格式將修飾字符存儲爲已修改的UTF-8,但開發人員不必擔心)
  • System.out將把UTF-16字符串轉碼爲default platform encoding;這可能是有損的過程,如果在編碼不是Unicode
  • 如果stdout流消費者(控制檯或任何其他應用程序)不解碼使用相同的編碼器的輸入,可能會發生字符腐敗
  • no supported mechanism用於改變JRE中的默認平臺編碼(並且包括使用-Dfile.encoding=foo

如何更正輸出將取決於您嘗試寫入的設備。有關cmd.exe,請參閱herehere。有關Java編碼的更多一般信息,請參閱here