1. 程式人生 > >亂碼問題,解決辦法不一定是”統一所有編碼”

亂碼問題,解決辦法不一定是”統一所有編碼”

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,都有可能會遇到亂碼。

      筆者雖見識膚淺,但對以上觀點深不以為然。之所以很多人強調編碼一致,其實是為了避免轉碼錯誤的風險,這是一種很保險的做法。個人認為,並不是說必須編碼一致,才能保證不出現編碼亂碼的問題。其實,未必要

全部用utf-8或者全部用gb18030下面請聽筆者婉婉道來。

       筆者在設計自己的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,我的java連線資料庫編碼也是gb18030,難道我要為了這個javaScript能正常執行而改變我其他的所有編碼嗎?!除了統一編碼,還有其他可能嗎?

       這個時候我開始了各種嘗試。

       第一種方法。是把傳遞過來的引數重新編碼成gb18030,假設傳遞過來的引數叫做insert_name。

        insert_name=new String(insert_name.getBytes("utf-8"),"GB18030");

        結果:依然亂碼,之前的亂碼是“濂�”,現在是“男”。

        QWQ,不要放棄,再來。有一種堅強叫“第二種方法”。(強行文藝)

       第二種方法。在編碼為gb18030的頁面,告知編譯器,傳遞引數的頁面是用的utf-8。我只用了一條語句:

        request.setCharacterEncoding("utf-8");

       結果:問題輕鬆解決。這個時候,無論後臺還是資料庫,都沒有亂碼,而且,最重要的是,一個頁面是用的utf-8,另一個頁面是用的gb18030 !這說明並不一定要統一編碼才能解決亂碼問題,只要跟編譯器說清楚,你每個頁面是用的什麼編碼就行了!

  最後,感謝圍觀~

        希望有所幫助~