關於 Ajax Post 的亂碼問題處理方法

今天寫JSP程序時遇到一件奇怪的事,在我的JSP頁面和後臺編碼(包括Tomcat服務器的編碼)都設置爲 UTF-8 的情況下,使用Ajax 進行Post 操作時仍然出現了中文亂碼的情況。

相關編碼設置如下:

JSP頁面:

<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
myEclipse 編碼設置:


Tomcat 編碼設置:



前端進行post操作的代碼如下:

var xhr = getXMLHttpRequest();
xhr.open("post", "conne", true);
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded;");
xhr.send(value);

後臺直接接收:

 request.getParameter("value");

奇怪的事情就發生了,使用 Firefox 提交的數據確實是按中文顯示的,但是 Chrome 瀏覽器提交的數據卻是亂碼。

於是我換了個方法,嘗試在服務端使用:

String(request.getParameter("value").getBytes("ISO-8859-1"),"utf-8");
結果 Chrome 瀏覽器提交的中文顯示正常了,但是 Firefox 瀏覽器提交的中文卻變成了亂碼。問題看起來似乎和瀏覽器的默認編碼有關係....

於是我參考一篇博客:http://www.cnblogs.com/qiuyi21/articles/1089555.html

這裏的解決方法是:在客戶端對上傳的數據使用js 進行兩重編碼,然後在服務端只需要對數據進行一次解碼操作即可。

代碼如下:

客戶端:

encodeURIComponent(encodeURIComponent(value));
服務端:

URLDecoder.decode(request.getParameter("value"),"utf-8");
問題解決了!


不過經過一番探索,我發現引起這個問題的關鍵原因並不在於瀏覽器,而是因爲我的 Servelet  沒有設置編碼的緣故。

所以,只需要在 Servelet 的 doPost 函數中加一句:

request.setCharacterEncoding("utf-8");

感覺 Servelet  實質也相當於生成一個頁面,如果沒有指定編碼的值,還是跑到默認的ISO-8859-1的編碼上去了,所以此處指定之後,瀏覽器們就統一了。所以此處推薦這種方案。

另外根據我的經驗,只要前臺和後臺同時使用UTF-8編碼,一般是不會出現亂碼問題的。而不是像某些教科書上寫的非得手動將所有的編碼的地方都硬改成“GB2312”或者“GBK”。事實上稍微懂一些編碼的知識就會知道UTF-8編碼其實是包含中文字符集的,而且它還支持多國語言和字符,擴展性和兼容性更好。我們平時在電腦上遇到的文件亂碼問題多半都是 ANSI  編碼惹的禍,不信你新建一個文本文檔,然後點擊“另存爲”,看看它的編碼是不是ANSI!一些編譯器打開文件的時候按照UTF-8或者GBK等等其他默認編碼打開就會出現亂碼,所以建議必要的時候還是手動將文檔另存爲UTF-8格式的。











發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章