這是我第一篇文章,堆棧溢出。自1998年以來我一直在做Java,所以我不是初學者。最近我遇到了一個我不記得遇到過的文件字符編碼問題。在不同平臺上運行時,必須瞭解文本文件的字符編碼以及編寫能夠正確處理編碼的代碼是很常見的。但是我發現的問題是由與執行平臺不同的平臺上的編譯造成的。這完全是出乎意料的,因爲根據我的經驗,當javac創建一個類文件時,重要的參數是java源和目標參數,以及執行編譯的JDK版本。我的情況是,在Mac OS X上使用JDK 1.6.0_22編譯的類與在Linux上使用1.6.0_23-b05編譯的類的行爲不同,在Mac OS X上運行時。指定的源和目標爲1.4。Java編譯器平臺文件編碼問題
在內存中編碼爲ISO-8859_1的字符串使用PrintStream println方法寫入磁盤。根據Java代碼編譯的平臺,字符串的寫法不同。這導致了一個錯誤。該錯誤的修復是在寫入和讀取文件時明確指定文件編碼。
讓我感到驚訝的是,行爲不同,取決於類的編譯位置,而不是在哪個平臺上運行。我非常熟悉Java代碼在不同平臺上運行時的行爲不同。但是當編碼在不同平臺上的相同代碼在相同平臺上以不同方式在相同平臺上運行時有點可怕。
有沒有人遇到過這個問題?對於任何讀取和寫入字符串的Java代碼,如果沒有明確指定字符編碼,它似乎都會生病。多久做一次?
感謝,
理查德·布魯斯特 http://rabbitsoftware.com
是編碼爲utf-8的有問題的文件嗎?源代碼中是否存在有問題的字符,或僅在該特定機器上編譯**之後,字符是否無效**? –
這是使用靜態最終編譯成類(編譯靜態最終「烘烤」字符串到類)?或者當你說寫入磁盤時,你是序列化數據?序列化類實例?序列化方法是使用默認(即編譯平臺)編碼編譯的? –
@Steve B .:事實上,所有的字符串文字和其他編譯時常量字符串都是「隱藏」到類中的,不僅是靜態的最終字符串。 –