Tomcat對於GET請求並不會考慮使用request.setCharacterEncoding方法設置的編碼,而會永遠使用iso-8859-1編碼,而這位朋友使用的正好是GET請求,因此,tomcat將會使用iso-8859-1將提交的字節轉換成字符串...
java web開發過程中,中文亂碼是一個老生常談的話題了,那麼該如何解決呢?
大致思路就是重新編碼為gbk或者gb2312,分兩種情況
a是get和post形式
b是ajax 形式
c是javascript url傳參亂碼問題
d是java web 下載文件名亂碼問題
e是utf8解決JSP中文亂碼問題
第一種:GET和POST,取決於你的頁面編碼,如果你的頁面編碼為iso8859_1
使用:String str= new String(req.getParameter("str").toString().getBytes("iso8859_1"), "GBK");
或者 String str= new String(req.getParameter("str").toString().getBytes("iso8859_1"), "GB2312");
但是,這裡要注意,必須保證你的頁面編碼也是iso8859_1的,因為,上面的代碼的意思是先將你的字符串變為iso8859_1字節流,
然後再轉化為GBK編碼,如果你頁面傳過來的編碼是utf-8,那麼按照上面的方法就會出現:???亂碼
你頁面是utf-8的,就要使用如下編碼:
String str= new String(req.getParameter("str").toString().getBytes("utf-8"), "GBK");
或者 String str= new String(req.getParameter("str").toString().getBytes("utf-8"), "GB2312");
總之get post 原則很簡單,頁面什麼編碼就轉化什麼字節流轉化編碼
第二:Ajax傳值
這個比較麻煩,據測試,不同的瀏覽器有不同的對中文編碼,怎麼辦呢?
我們可以採用js的encodeURI()進行統一的編碼,然後在後臺進行統一的解碼
對應的Java解碼代碼:
str= java.NET.URLDecoder.decode(str, "UTF-8");
當然,因為他是utf-8編碼,所以也可以採用第一種get post 介紹的方法解碼(據測試,用String(req.getParameter("str").toString().getBytes("utf-8"), "GB2312")解碼js的encodeURI()時,會出現亂碼,所以還是老老實實的使用java.Net.URLDecoder.decode(str, "UTF-8");)
不好意思,剛剛查了資料,上面講的Get方式有錯:
Tomcat對於GET請求並不會考慮使用request.setCharacterEncoding方法設置的編碼,而會永遠使用iso-8859-1編碼,而這位朋友使用的正好是GET請求,因此,tomcat將會使用iso-8859-1將提交的字節轉換成字符串。
所以,對於使用get方式傳值的時候,統一使用String str= new String(req.getParameter("str").toString().getBytes("iso8859_1"), "GBK");當然,前提是你服務器是tomcat
第三:javascript url傳參亂碼問題
方案一html頁面:
function testOne() {
var url = "testTwo.action?expr="+你好;
window.location.href = encodeURI(url);
}
後臺java代碼:
String expr = new String(
request.getParameter("expr").getBytes("ISO-8859-1"),"UTF-8");
方案二html頁面:
function testTwo() {
var url = "testTwo.action?expr="+你好;
window.location.href= encodeURI(encodeURI(url));
}
第四:java web 下載文件名亂碼問題
第一種:設置
response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode(fileName, "UTF-8"));
這裡將文件名編碼成UTF-8的格式,就不會出現URL出錯了。IE6下注意中文文字不能超過超過17個。
第二種:設置
response.setHeader( "Content-Disposition", "attachment;filename=" + new String( fileName.getBytes("gb2312"), "ISO8859-1" ) );
將中文名編碼為ISO8859-1的方式。不過該編碼只支持簡體中文.
按照上訴方式,可以綜合一下兩種方式解決絕大部分中文問題。
fileName = URLEncoder.encode(fileNameSrc,"UTF-8");
if(fileName.length()>150)//解決IE 6.0 bug {
fileName=new String(fileNameSrc.getBytes("GBK"),"ISO-8859-1");
response.setHeader( "Content-Disposition", "attachment;filename=" + fileName);
}
第五:utf8解決JSP中文亂碼問題
一般說來在每個頁面的開始處,加入:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%request.setCharacterEncoding("UTF-8");%>
以上就是java中文亂碼的全部內容了,感謝大家的閱讀!