1.URL亂碼
有的是,,不可避免要在URL上傳中文,,用一些框架(spring MVC,struts)可以解決,。但是我們也可以自己手動(dòng)解決,。
String url = "http://www.softbeta.?name=小武"; // url編碼url = "http://www.softbeta.?name=" + java.net.URLEncoder.encode("小武"); System.out.println("url:" + url); // url解碼url = "http://www.softbeta.?name=" + java.net.URLDecoder.decode("小武"); System.out.println("url:" + url);
String url = "http://www.softbeta.?name=小武";
// url編碼
url = "http://www.softbeta.?name=" + java.net.URLEncoder.encode("小武");
System.out.println("url:" + url);
// url解碼
url = "http://www.softbeta.?name=" + java.net.URLDecoder.decode("小武");
System.out.println("url:" + url);
encode(String s) 和 decode(String s)方法會(huì)采用系統(tǒng)的默認(rèn)編碼,已標(biāo)記為@deprecated 取代為帶編碼的方法encode(String s, String enc),decode(String s, String enc),。
String url = "http://www.softbeta.?name=小武"; // url編碼url = "http://www.softbeta.?name=" + java.net.URLEncoder.encode("小武","utf-8"); System.out.println("url:" + url); // url解碼url = "http://www.softbeta.?name=" + java.net.URLDecoder.decode("小武","utf-8"); System.out.println("url:" + url);
String url = "http://www.softbeta.?name=小武";
// url編碼
url = "http://www.softbeta.?name=" + java.net.URLEncoder.encode("小武","utf-8");
System.out.println("url:" + url);
// url解碼
url = "http://www.softbeta.?name=" + java.net.URLDecoder.decode("小武","utf-8");
System.out.println("url:" + url);
url encode和decode在前端js也有很好的支持,,這樣能方便我們處理請(qǐng)求和響應(yīng)。
2.JSP亂碼
在基于框架開發(fā)中,,JSP亂碼基本上由框架解決,,但是有些地方我們的編碼需要統(tǒng)一。
在JSP文件頭,,一般加入:
Jsp代碼
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
charset=UTF-8的作用是指定JSP向客戶端輸出的編碼方式為"UTF-8",;
pageEncoding="UTF-8",為了讓JSP引擎能正確地解碼含有中文字符的JSP頁面,;
如果對(duì)請(qǐng)求編碼:
Java代碼
request.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");
還有一種是在web容器中設(shè)置編碼,。如Tomcat,如果上面的方法都能解決亂碼,,可以在server.xml修改URIEncoding:
Xml代碼
<Connectorport="8088"protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443"URIEncoding="utf-8"/>
<Connector port="8088" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="utf-8"/>
3.打包文件(zip)亂碼
如果用原生的java.util.zip.ZipOutputStream進(jìn)行文件打包,,當(dāng)文件名出現(xiàn)中文的時(shí)候,會(huì)出現(xiàn)亂碼,,目前還沒有很好的解決方法,,除非修改這個(gè)類的代碼,然后重新打包,。
org.apache.tools.zip.ZipOutputStream用這個(gè)類進(jìn)行打包可以設(shè)置編碼,,有效的解決中文問題。
Java代碼
ZipOutputStream zos = new ZipOutputStream(os); zos.setEncoding("GBK"); ... zos.flush(); zos.close();
ZipOutputStream zos = new ZipOutputStream(os);
zos.setEncoding("GBK");
...
zos.flush();
zos.close();
4.其他情況通用解決
像文件亂碼,,數(shù)據(jù)庫亂碼...等,,很多時(shí)候是方法沒有用對(duì),,字符集設(shè)置不統(tǒng)一或沒有用對(duì)。對(duì)文件讀寫,,用正確的流,,合適的編碼,一般不會(huì)出問題,。數(shù)據(jù)庫也是一樣,,數(shù)據(jù)庫的編碼也后臺(tái)處理程序編碼要統(tǒng)一。但是還是有一些情況我們不能成功解決亂碼問題,,這是只有強(qiáng)制轉(zhuǎn)碼了,。
Java代碼
/*** 轉(zhuǎn)碼** @author oliver* @created 2011-10-13** @param str 需要轉(zhuǎn)碼的字符串* @param originEncode 原字符串編碼* @param destEncode 需要轉(zhuǎn)向的編碼* @return* @throws UnsupportedEncodingException*/publicstatic String transcoding(String str,String originEncode,String destEncode) throws UnsupportedEncodingException{ if(str==null || str.trim()==""){ return str; } returnnew String(str.getBytes(originEncode),destEncode); }
/**
* 轉(zhuǎn)碼
*
* @author oliver
* @created 2011-10-13
*
* @param str 需要轉(zhuǎn)碼的字符串
* @param originEncode 原字符串編碼
* @param destEncode 需要轉(zhuǎn)向的編碼
* @return
* @throws UnsupportedEncodingException
*/
public static String transcoding(String str,String originEncode,String destEncode) throws UnsupportedEncodingException{
if(str==null || str.trim()==""){
return str;
}
return new String(str.getBytes(originEncode),destEncode);
}
如果你知道亂碼字符串以前用的編碼,那么可以用上面的方法解決亂碼,。
在java.nio包中,,也有類似編碼解碼的方法。
Java代碼
String name="中文"; Charset ct = Charset.forName("utf-8"); ByteBuffer encode = ct.encode(name); name=ct.decode(encode).toString();
String name="中文";
Charset ct = Charset.forName("utf-8");
ByteBuffer encode = ct.encode(name);
name=ct.decode(encode).toString();
總之,,亂碼問題很多時(shí)候是由于我們的方法,,工具沒有選擇正確,或者編碼不統(tǒng)一,。如果真的沒有其他好的辦法,,可以自己寫工具強(qiáng)制轉(zhuǎn)碼。