2

我想知道如何讓我的代碼在不同的平臺(至少windows和linux)上產生相同的輸出(UTF-8或UTF16)。
我認爲有可能設置一個代碼頁供應用程序使用,但我找不到要設置代碼頁的信息。而且我不知道設置代碼頁是否在使用特殊字符(如äöü或其他非拉丁字符)時真的會產生相同的輸出。Java - howto平臺獨立輸出

我想有一個解決方案,不需要爲java.exe設置參數。

編輯:
我的意思是輸出到控制檯。關於可能對其他輸出媒體產生影響的評論會很好。

+0

你的意思是輸出到控制檯?到一個文件?一個gui? – assylias

+0

如果輸出在控制檯上,則取決於控制檯的功能:您無法真正控制該功能。 – fge

+0

對不起,我的意思是控制檯。但是對任何解決方案如何影響輸出到文件/ gui /的評論都是很好的。 – wullxz

回答

1

一個字符集(或代碼頁,因爲它曾被稱爲)將字符序列轉換爲一個字節序列。

在Java API中,字符集被實現爲Charset的子類。在字符和字節之間轉換的所有API元素都可以提供字符集使用(許多也允許您傳遞字符集名稱,所以您不必自己查找)。如果您不提供字符集,這些方法通常會回退到操作系統的默認編碼。

例如,OutputStreamWriter設有一個構造函數字符集:

try (Writer w = new OutputStreamWriter(System.out, "utf-8")) { 
    w.write("Hello world"); 
} 
+0

我在'write'語句後面加了'w.flush(),讓streamwriter輸出緩衝區。這在Linux中工作,但它不在Windows中。我的測試字符串是「HellöWörld\」。我還將eclipse設置爲使用UTF-8作爲默認編碼。 – wullxz

+1

@wullxz如果目標設備不接受UTF-8數據,它在Windows上不起作用。例如,cmd.exe命令提示符默認使用來自20世紀80年代的特定於語言環境的OEM代碼頁,並使用舊的柵格字體 - 分析[here](http://illegalargumentexception.blogspot.co.uk/2009/04/i18n-unicode-在 - 窗口命令prompt.html)。大多數Linux終端使用UTF-8。 – McDowell

+0

好吧,所以這是windows shell(CMD/Powershell)與我的輸出混淆?是否有可能讓我的應用程序檢查當前終端支持哪個代碼頁,然後讓OutputStreamWriter使用適當的代碼頁/字符集? – wullxz

1

Java的char類型使用UTF-16,其能夠表示Unicode字符集每個代碼點的。幾乎所有使用字符串的I/O都涉及一些隱式轉碼操作。

要保存和恢復字符數據而不丟失或損壞,通常最好使用Unicode轉換格式之一。有readerwriter類型可用於執行此代碼轉換操作。避免使用默認構造函數,因爲它們依賴於默認編碼,這種編碼可能是過去幾十年來最好的遺留編碼。明確指定UTF-8通常是首選。

寫入終端存在不同的問題。在這裏,您正在編寫將由另一個應用程序解碼的數據,因此您必須以其理解的格式編寫字符數據。

Console類型將檢測和使用終端的編碼,而System.out使用默認的平臺編碼 - 由於一系列歷史原因,這些在Windows上是不同的。其他差異記錄在here。在cmd.exe中使用Unicode的文檔化方式是使用適當的Win32 API調用。

從我的博客一些相關的帖子:

BalusC也有一定的字符處理實際問題的好崗位:Unicode - How to get the characters right?