我想知道如何讓我的代碼在不同的平臺(至少windows和linux)上產生相同的輸出(UTF-8或UTF16)。
我認爲有可能設置一個代碼頁供應用程序使用,但我找不到要設置代碼頁的信息。而且我不知道設置代碼頁是否在使用特殊字符(如äöü或其他非拉丁字符)時真的會產生相同的輸出。Java - howto平臺獨立輸出
我想有一個解決方案,不需要爲java.exe設置參數。
編輯:
我的意思是輸出到控制檯。關於可能對其他輸出媒體產生影響的評論會很好。
我想知道如何讓我的代碼在不同的平臺(至少windows和linux)上產生相同的輸出(UTF-8或UTF16)。
我認爲有可能設置一個代碼頁供應用程序使用,但我找不到要設置代碼頁的信息。而且我不知道設置代碼頁是否在使用特殊字符(如äöü或其他非拉丁字符)時真的會產生相同的輸出。Java - howto平臺獨立輸出
我想有一個解決方案,不需要爲java.exe設置參數。
編輯:
我的意思是輸出到控制檯。關於可能對其他輸出媒體產生影響的評論會很好。
一個字符集(或代碼頁,因爲它曾被稱爲)將字符序列轉換爲一個字節序列。
在Java API中,字符集被實現爲Charset
的子類。在字符和字節之間轉換的所有API元素都可以提供字符集使用(許多也允許您傳遞字符集名稱,所以您不必自己查找)。如果您不提供字符集,這些方法通常會回退到操作系統的默認編碼。
例如,OutputStreamWriter
設有一個構造函數字符集:
try (Writer w = new OutputStreamWriter(System.out, "utf-8")) {
w.write("Hello world");
}
我在'write'語句後面加了'w.flush(),讓streamwriter輸出緩衝區。這在Linux中工作,但它不在Windows中。我的測試字符串是「HellöWörld\」。我還將eclipse設置爲使用UTF-8作爲默認編碼。 – wullxz
@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
好吧,所以這是windows shell(CMD/Powershell)與我的輸出混淆?是否有可能讓我的應用程序檢查當前終端支持哪個代碼頁,然後讓OutputStreamWriter使用適當的代碼頁/字符集? – wullxz
Java的char
類型使用UTF-16,其能夠表示Unicode字符集每個代碼點的。幾乎所有使用字符串的I/O都涉及一些隱式轉碼操作。
要保存和恢復字符數據而不丟失或損壞,通常最好使用Unicode轉換格式之一。有reader和writer類型可用於執行此代碼轉換操作。避免使用默認構造函數,因爲它們依賴於默認編碼,這種編碼可能是過去幾十年來最好的遺留編碼。明確指定UTF-8通常是首選。
寫入終端存在不同的問題。在這裏,您正在編寫將由另一個應用程序解碼的數據,因此您必須以其理解的格式編寫字符數據。
Console
類型將檢測和使用終端的編碼,而System.out
使用默認的平臺編碼 - 由於一系列歷史原因,這些在Windows上是不同的。其他差異記錄在here。在cmd.exe中使用Unicode的文檔化方式是使用適當的Win32 API調用。
從我的博客一些相關的帖子:
BalusC也有一定的字符處理實際問題的好崗位:Unicode - How to get the characters right?
你的意思是輸出到控制檯?到一個文件?一個gui? – assylias
如果輸出在控制檯上,則取決於控制檯的功能:您無法真正控制該功能。 – fge
對不起,我的意思是控制檯。但是對任何解決方案如何影響輸出到文件/ gui /的評論都是很好的。 – wullxz