寫的有些亂 不喜歡 勿噴 。有一點可以肯定的是 每一個場景 沒一個過程都是實實在在。
場景:
前端 調 java的接口 讀寫服務器上的配置文件,同時這個文件寫入的數據 c的程序也要去讀取文件。相當於文件是個數據源,在業務側起到一個切換場景,工廠模式裏面的不同參數的角色。
問題 :
1、java的程序用的是第三方的ini4j的 類庫直接對文件進行讀寫。這個庫 默認就是utf8 的編碼格式 不管是讀還是寫都是utf-8的字符編碼。這個最一開始只是在xshell 顯示有問題 前臺展示沒有問題,c那邊讀取時亂碼。
2、 改了寫入的字符編碼 然後 c那邊沒有問題了,但是前臺展示有問題了,同時自己的demo在xshell控制檯打印的也是有問題
3、 把讀寫強制的加入了 字符編碼的格式約束,這個過程花了不少時間,因爲最一開始不知道是什麼原因。現場c的程序一會讀的是亂碼,一會不是亂碼很煩。用了那個iconf 命令轉化也是不行。
4、 就是把所有的都對齊了 就是前端 java接口 文件編碼 服務器編碼 c端的編碼 最後發現 用cat 和vim 打開是時候兩個又是亂碼, 還有就是 後面寫入的會導致前面的內容是亂碼。控制檯打印的 時而亂碼時而不亂碼。把服務器上的文件導下來看也是亂碼的。你改過流的編碼過後,之前在本地調試的部分瞬間又跑不通了,很是詭異, 瞬間就爆炸了。
問題解決的過程:
服務器上
創建一個空文件
用 file 文件名 命令看是 沒有編碼的 說明:文件的編碼主要是針對你輸入的流的編碼
用 服務器上的編輯工具 cat vim 進行編輯 後
你會發現 不帶中文的文件就是 ASCII 編碼
帶中文的文件就是 ISO8859-1
你在服務器上看文件編碼大部分都是 ASCII ISO8859-1 尤其是etc下面的配置文件
本地(window)創建文件 然後傳到服務器上(linux)
本地創建一個用記事本打開的 一個沒用中文傳到 服務器上 然後用 file 查看 是 ASCII編碼 帶中文的就是 ISO8859-1
本地穿件一個用字符編碼 uft8 的那麼傳到服務器不管中英文都還是utf8 這個爲什麼utf8 作爲網絡通信常用的原因雖然佔的資源多。
即 除了utf8 服務器和 本地保持一致,其餘帶中文的服務器上就是ISO8859-1 不帶中文的就是 ASCII
===================================下面就是調試測試的============================================
控制讀取的字符編碼
InputStreamReader isr = new InputStreamReader(new FileInputStream(filePath), "GBK");
Wini ini = new Wini(isr);
控制寫入的字符編碼
OutputStreamWriter oStreamWriter = new OutputStreamWriter(new FileOutputStream(new File(filePath)), "GBK");
ini.store(oStreamWriter);
其它的業務代碼就沒有貼了 總要是說明一下Inij4j也可以具體的切換不同的字符編碼。 (默認的是utf8)尤其是在服務器的時候是其它編碼的時候你用其它的去寫 這樣文件就變成是utf8的格式。 這樣很容易出問題。
還有一個問題就是當你的文件原本是utf8 的格式 用utf8 的操作沒有問題 ,然後在原來文件的基礎上用GBK或者其它的字符集的時候你會發現 上次寫入的utf8的東西是亂碼。這樣就要求你文件是什麼格式 那你至始至終就得用什麼格式編碼,主要是中文他煩,英文貌似不會遇到這樣的問題。
就是在測試的過程你會發現你文件的,又會各種亂碼。這裏主要就是 xshell 文件編碼 還有就linux環境變量設置和控制的。
就是說 你服務器文件是iso8859-1 那麼你用的xshell終端必須是gbk 系列的編碼 看差不會保證不會亂碼。如果你文件是iso8859-1 那你xshell終端用utf-8 你不管用 cat 還是vim 都會是亂碼的。還有就是你的流輸出的是什麼編碼 必須和環境編碼的 LANG d對應起來 有些人說要改 /etc/systemconf/i18n 文件 最近幾天貌似和這個對應不起來 就是說 LANG 設置的是zh_un.GK2312
/etc/systemcon/i18n 設置的對應的是 utf8 的格式 如果你的流是ut8 格式輸出的東西在xshell控制檯是亂碼的。也就是說LANG 是對控制檯起決定性作用的。
還有就是上面提到的 對同一個文件 第一次是utf8 第二次 gbk 這樣有可能導致之前的uft8 格式寫入的東西是亂碼,這個時候你不管是用gbk 輸出還是utf8 輸出 LANG 不管怎麼設置也都是亂碼, 同時你在 shell改變中段的 字符也是亂碼的。也是我就是亂碼的 和展示 打印沒有關係 換個編碼 我只是將這個亂碼變成下一個亂碼。
參考資料:
解決中文亂碼的問題
https://jingyan.baidu.com/article/ab69b270de8b4f2ca7189f1d.html
解決vim 和用cat 顯示亂碼的問題。
https://blog.csdn.net/onepiecehuiyu/article/details/75208743
編解碼:
https://blog.csdn.net/zhblanlan/article/details/81458943
ini4j 編碼問題
https://blog.csdn.net/cp1153750171/article/details/81432939
注: 參考鏈接裏面的東西 和我驗證的對應不起來 因此和我寫的有些出入,實際還是根據大家驗證的爲準, 實際纔是檢驗真理的唯一標準。