開發過程中總避免不了遇到噁心的亂碼,或者由亂碼引發的一系列問題。出現亂碼是字元集的原因一般而言和邏輯沒有太大關係,也就是說整個系統大的方向沒有問題,小的地方出現了漏洞,進而導致程式不能正常運行,所以說出現亂碼是一件令人非常很噁心的事情。這裡簡要介紹一下自己遇到的亂碼問題和解決問題的過程中的想法以及大致的操作,我們要學會的是如何分析問題進而解決問題,而不僅僅是照著網上的操作去一次次的解決眼前的困難,“魚”與“漁”的區別就在於此。
交代背景:
要實現的功能很簡單,用dom4J讀取XML檔案然後藉助Spring以及Hibernate將資料寫入到MySql資料庫(多表)中,當然整個過程是由Spring控制事務一次性完成,有異常進行復原。
現象:在往資料庫裡寫資料寫到一半的時候報錯,大致的錯誤資訊是:記錄不是唯一。
分析和操作:
檢查了一遍自己的代碼,用Spring當中的HibernateTemplete儲存資料,應該沒有問題。
再次觀察現象:好像是外鍵約束的問題,因為每當插入到帶有外鍵的表的時候資料死活錄入不進去。
分析和操作:
既然是外鍵表的問題,首先應該確定外鍵表中的內容是什麼,於是手動改資料庫隔離等級查看資料,果然裡面是亂碼!
問題:亂碼是怎麼進入資料庫的?
分析和操作:
要麼讀取xml的時候就是亂碼,要麼在往資料庫裡寫的時候變成亂碼。再次斷點調試測試在程式中是否亂碼。
現象:在eclipse當中列印出來資訊沒有出現亂碼問題
分析與操作:
這就說明在程式中一切沒有問題,是資料庫的問題。於是先改資料庫連結字串指定編碼,再改資料庫的編碼,再次斷點調試。
現象:資料庫中依然是亂碼,但是亂碼的形式換了,之前全是“?”現在是一些亂七八糟的文字。
分析和操作:
很明顯上面一系列修改編碼格式的操作起作用了,只是沒有修改對而已。再次檢查各項的編碼格式,沒有發現問題
問題一度陷入僵局……
尋求協助:秋提出別用命令視窗了,太麻煩了,用第三方用戶端吧,於是換用第三方用戶端,奇怪的是用戶端顯示沒有問題!
分析和操作:
用戶端沒有問題命令視窗有問題,那就說明資料庫裡已經不是亂碼,亂碼可能是命令列顯示的問題。設定命令列顯示字元,果然顯示正常!再次測試資料匯入----一切OK。
思考與總結:
現象:其實在第一次修改完各項編碼的時候這個問題已經算是解決了,但是由於當時自己斷點調試的時候沒有讓程式執行完所以一直認為資料庫中依然是亂碼。
總結:
應該在每次調試的時候讓程式跑完,將錯誤的上下文環境類比出來,而不是只關注錯誤本身。
現象:在這裡涉及到編碼的地方有XML的編碼、dom4j的讀取編碼、資料庫編碼、資料庫連接字串指定編碼、命令列視窗顯示編碼。這其中哪個沒有注意到問題也解決不了(這裡自己沒有意識到最後一個)。
總結:
全域觀的意思是把握每個控制變數,從開始到結束,有意識的跳出環境來做假設。