亂碼問題,解決辦法不一定是”統一所有編碼”
2017.5.28
筆者在論壇上看到過這樣的帖子,引用一下原文:
“
看到亂碼,一般不想回答,因為問這個問題的人太多了,但是還是忍不住說幾句吧。
1. 專案決定用 UTF-8
2. 程式的原始碼要用 UTF-8(Java,HTML)
3. HTML 的 meta 裡要指定用 UTF-8
4. 資料庫用 UTF-8
5. 資料庫和 Java 的連線用 UTF-8
6. Tomcat 的 Get 設定為用 UTF-8
其他的暫時想不起來的,只有這些都用了 UTF-8,那麼才不會出現亂碼,如果中間有某一個沒有使用 UTF-8,都有可能會遇到亂碼。
”
筆者雖見識膚淺,但對以上觀點深不以為然。之所以很多人強調編碼一致,其實是為了避免轉碼錯誤的風險,這是一種很保險的做法。個人認為,並不是說必須編碼一致,才能保證不出現編碼亂碼的問題。其實,未必要
筆者在設計自己的bbs的時候,就遇到了一個問題。
---------------亂碼問題詳述,可跳過--------------------------------------------------
我想實現一個功能:註冊的時候,滑鼠離開文字框,用JavaScript的函式檢查文字框內容的長度以及是否為空,並根據函式返回的結果,提示使用者進行操作。這個提示使用者進行操作的元素是一個id=“pwdv”的span元素,JavaScript裡面寫的語句是:document.getElementById("pwdv").innerHTML="密碼不能少於六位";
我發現,只有當pageEncoding為utf-8的時候,這個span元素顯示的中文文字才能正確顯示。(可能和innerHTML預設編碼為utf-8有關)。所以我果斷把pageEncoding設定成了utf-8。
--------------------------------------------------------------------------------------------------
那麼,問題來了。當我插入註冊資訊到資料庫的時候,資料庫是亂碼的,於是我在後臺打印出了資料,發現也是亂碼的,也就是說,編碼為utf-8的頁面傳遞表單給編碼為gb18030的頁面時,出現了亂碼。(為幫助理解下文的解決方法,請記住這句話,是從utf-8頁面傳到GB18030頁面)
這個時候我開始了各種嘗試。
第一種方法。是把傳遞過來的引數重新編碼成gb18030,假設傳遞過來的引數叫做insert_name。
insert_name=new String(insert_name.getBytes("utf-8"),"GB18030");
結果:依然亂碼,之前的亂碼是“濂�”,現在是“ç·”。
QWQ,不要放棄,再來。有一種堅強叫“第二種方法”。(強行文藝)
第二種方法。在編碼為gb18030的頁面,告知編譯器,傳遞引數的頁面是用的utf-8。我只用了一條語句:
request.setCharacterEncoding("utf-8");
結果:問題輕鬆解決。這個時候,無論後臺還是資料庫,都沒有亂碼,而且,最重要的是,一個頁面是用的utf-8,另一個頁面是用的gb18030 !這說明並不一定要統一編碼才能解決亂碼問題,只要跟編譯器說清楚,你每個頁面是用的什麼編碼就行了!
最後,感謝圍觀~
希望有所幫助~