最近幫朋友作一個標準的WEB管理會員系統,到了項目開發後期,才發現一個很是致命的問題:中文亂碼。
ok,具體問題是這樣的:在eclipse+tomcat開發環境運行下,前臺用火狐、谷歌瀏覽器以及IE運行都不會出現前臺輸入中文,後臺接收亂碼的狀況。但在單純運行環境tomcat server部署war容許下,就會出現前臺輸入中文,後臺java接收字符亂碼。
可能不少同窗就會說,你多是前臺jsp文件沒有強制和後臺開發語言設置相同的編碼格式,因此會出現前臺傳入後臺亂碼的狀況。但實際上的狀況是,我已經徹底統一了所有編碼格式爲UTF-8,前臺和後臺以及數據庫的編碼格式徹底一致,這就解釋了爲何在eclipse開發環境下能夠運行,且不存在任何亂碼。
如今問題就出現了,很靈異。在tomcat純運行狀況下,就會出現亂碼。我就在考慮是不是tomcat服務器上的字符設置,而後就去網上搜各類修改tomcat server.xml的配置,呵呵,結果是失敗的。而後我就各類抓狂,嘗試去查看亂碼格式,結果猜出來亂碼爲GBK,在後臺用new String(str.getByte("gbk"),"utf-8")這樣是能夠將亂碼文字解碼。哈哈哈,若是你認爲這個問題就這樣解決了,你就天真了。這樣的解碼只能對偶數箇中文有用,對奇數箇中文就會存在或首或尾出現亂碼,這樣的話,整個問題是徹底沒解決到的。不過好在,用猜出來,從瀏覽器過來的中文格式是gbk,然而這並無什麼用。其實如今都還真的沒有搞懂,爲什麼從在限制jsp context編碼utf-8的狀況下,爲什麼會傳gbk這種編碼過來。
這個問題已經到了困擾到用戶不能直接用的地步,因此必須先解決。而後就各類在網上搜,最後發現,又多是數據從瀏覽器端傳出的時候被更改,因此去排查因此跟輸入中文有關的地方,發現,我項目絕大多數的地方都用了AJAX,then我將能form提交的地方都改了,而後強制accept-charset="utf-8",最後解決了亂碼問題。
固然這不是重點,由於從根本上沒有解決AJAX post 中文亂碼的問題。你不能說整個項目都不用AJAX(對於界面局部刷新是必須的),這是幾乎不可能的。因此,我仍是得硬着頭皮繼續找解決方法。網上搜前臺編碼,排除不少,一個一個試,最後找到了方法:在前臺js用AJAX以前,將所要傳送的中文值強制編碼:encodeURIComponent(eval(document.getElementById('username')).value),而後後臺用java.net.URLDecoder.decode(user.getUsername(), "utf-8");這樣就完美解決了AJAX傳中文的問題。
這樣解決方案是比較暴力的了,若是你的項目有上幾十甚至上百的頁面用到ajax傳中文值,那就呵呵了。這也是我寫這篇文章的初衷,但願有更多的大牛看到,從而找出更好解決辦法。
最後但願這篇文章對有相同問題的同窗有用,由於我也是在遇到問題的時候但願能夠獲得幫助。
最後祝各位 have nice day!java