24 碰到的一个 idea的奇怪的编码问题
以下為日記內容, 實質記錄是發生在昨天, 08.09
咦, 現在的文檔下載都至少需要 1個積分了嗎, 之前的那些免費的文檔似乎也被csdn控制成了需要1積分下載了?
--------------------------------------------------
今天 晚上 idea 遇到了一個編碼問題 我不太明白, 說一下環境吧
idea 啟動程序編碼[-Dfile.encoding]默認是 utf-8, 然后 測試程序文件的編碼 是gbk, 然后 System.out.println 出來[debug的結果也是一樣]的結果為 該字符串的 gbk編碼之后 utf-8解碼的亂碼 "���"
這個倒是正常的瑟, 文件寫入以 gbk 寫入, 然后 以utf-8讀出 亂碼, 然后 之后的時候, 我在測試程序配置了一下啟動參數 -Dfile.encoding=gbk, 然后 媽的 返現輸出 還是亂碼 "???"
然后 之后的時候, 我就把 idea的 jvm 配置增加了 -Dfile.encoding=gbk, ## 這時候, 原來是 gbk 的文件, 不知為何idea突然 換成了以 utf-8 加載, 然后 我以gbk編碼reload了一下, 正常了,?
然后 繼續跑, 然后 發現, 還是 以gbk編碼之后 utf-8解碼的亂碼 "���", 然后 之后 再啟動測試程序配置了一下啟動參數 -Dfile.encoding=gbk, 然后 還是 "???"
然后 就在我放棄的時候, 我刪掉了 idea 的jvm配置 -Dfile.encoding, 然后 刪掉了測試程序的 -Dfile.encoding, 然后 跑了一下, 我去 居然又好了, 真是奇怪
然后 我想了一下, 可能存在的原因, 可能是因為 我的項目是 gbk 編碼嘛, 然后 但是存在部分文件是 utf-8 編碼, 然后 在決策以什么編碼編譯的時候, 編譯器可能以utf-8讀取的文件, 但是 為什么測試程序 配置了 -Dfile.encoding=gbk, 然后 讀取到的數據 仍然是亂碼, 這個 我就不知道了[因為根本與 file.encoding的配置沒有關系]
然后 ?我嘗試證實一下這個猜想, 然后 更新了一下 外部的一個文件的編碼, 以及 req_dto包下面的一個文件的編碼, 更新為 utf-8, 然后 發現, 我的猜想是錯的 !
java編譯器編碼和JVM編碼問題?
https://www.zhihu.com/question/30977092/answer/50182545
然后 看了一下 R大的這篇文章, 我覺得問題可能實在 編譯器編譯的時候的編碼, 可能在第一次進來的時候 和最后一次運行的時候, 可能是讀取源碼文件的時候編碼可能不一致吧, 可能前者使用 utf-8讀取的源碼, 然后 后者以gbk讀取的文件, 然后 執行的時候, 因為字節碼規范約定的字符串以utf-8存儲, 然后 jvm讀取字節碼的時候 以utf-8讀取字符串[偏離了這里的問題之外]
問題的出現的原因
-----
這個 問題, 還得想想, 說不定 可以寫出一篇博客, 如果能夠重現問題就好了,?
哦, 說一下 問題的出現的吧, 首先是 我創建了一個 train_dto 的包, 然后 吧train相關的 reqdto 拷貝進來了, 文件格式是 utf-8m,?
然后 其余的大部分文件時 gbk, 外圍的 test03 還有幾個utf-8的文件, 然后 新建了一個 gbk 的 Test27GenerateXYJParamSql, 然后 跑的時候, 就出現了 這個問題,
源碼的編碼[gbk] - 編譯器讀取文件的編碼
在之前存在亂碼問題, 在之后增加 -Dfile.encoding idea配置選項, 然后又刪除, 重啟之后不存在亂碼
源碼的編碼[utf-8] - 編譯器讀取文件的編碼
吧 Test29OutputChinese 編碼變成 utf-8, 然后 輸出的結果 為 "浣犲ソ"[utf-8, gbk]
測試程序 源碼 gbk, 加上-Dfile.encoding=gbk, 之后 str.getBytes("gbk"), "utf-8") 為 "???" [這個輸出不一樣, 可能是與System.out的輸出編碼有關系]
## 哦, 對了, 還有一個 編碼是 System.out.println 編碼, 但是 不應該是這個, 畢竟 debug 調試的時候, 字符串就已經是 亂碼了,
哦, 對了 吧 Test29OutputChinese 編碼變成 utf-8, 然后 javac -p 給定的字節碼文件, 得到的結果 是"浣犲ソ"的亂碼, 然后 文件如果是 gbk編碼寫出, 則是正常的 "你好", 因此, 可以推測出 javac 的讀取源碼的編碼是 使用的編碼是 gbk[也就是 R大回答的如果編譯的時候 沒有指定-encoding 讀取平臺默認編碼, 我這里的默認編碼為 gbk]
--------------------------------------------------
然后 加上 -Dfile.encoding=gbk, 字節碼中得到的是正常的 "你好", 然后 str.getBytes("gbk") 得到的是 [-60, ?-29, ?-70, ?-61]
加上 -Dfile.encoding=utf-8, 字節碼中得到的是正常的 "你好", 然后 str.getBytes("gbk") 得到的是 [-60, ?-29, ?-70, ?-61]
調試 上面的兩個 -Dfile.encoding, 在 StringCoding. decode(byte[] ba, int off, int len) 末尾, 兩個得到的結果是一致的 !
然后 看兩個字符串包裝的 char數組, 發現他們的數據 也是一樣的, 然后 這里的輸出不一樣, 可能是與 System.out 的輸出編碼有關系[強調了三次]
在上面兩個 -Dfile.encoding 調試的時候, 我去 jvm 還崩潰了一次, 在 StringCoding. decode(byte[] ba, int off, int len) 之后
然而 直接 run as 卻沒事,,. 我去 這是什么情況, 現在 不知為何, 只要 已在 String.class 中打斷點, 一下就崩潰了[前幾次調試都還行, 后來不知怎么的就掛了],, 不論哪一種 -Dfile.encoding
調試 StringEncoding.encode 的過程中的crsh 日志文件 :?http://download.csdn.net/download/u011039332/9928429
今天 又來debug, 結果 還是 crash了, 然后 這里的日志是今天的crash日志, 昨天的被刪掉了
?
--------------------------------------------------
對了, 差點忘記了放測試代碼, 幾句 System.out.println
?
/*** Test28OutputChinese** @author Jerry.X.He <970655147@qq.com>* @version 1.0* @date 8/9/2017 8:43 PM*/ public class Test28OutputChinese {// Test28OutputChinesepublic static void main(String[] args) throws Exception {String str = "你好";System.out.println(str);System.out.println(Charset.defaultCharset());byte[] gbkDecoded = str.getBytes("gbk");for (byte b : gbkDecoded) {System.out.print(b + " ");}System.out.println();String gbkUtf8 = new String(str.getBytes("gbk"), "utf-8");System.out.println(gbkUtf8); // info(new String(str.getBytes("gbk"), "ascii"));String utf8Gbk = new String(str.getBytes("utf-8"), "gbk");System.out.println(utf8Gbk);}}--------------------------------------------------
?
?
?
希望之后能夠回過頭來真真正正的有頭有尾的解釋這個問題吧[上面都只是猜測], 哦, 對了 還有這個 crash 的原因
?
refer?
https://www.zhihu.com/question/30977092/answer/50182545
?
總結
以上是生活随笔為你收集整理的24 碰到的一个 idea的奇怪的编码问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓与互联网连接之HTTTP请求
- 下一篇: tomcat-tunning