- 論壇徽章:
- 0
|
一、文件亂碼處理
1、文件默認編碼:默認使用項目的默認編碼
右擊文件->roperties->Resource->Text file encoding
2、JSP文件編碼:由于JSP要翻譯為Servlet
<%@ page language="java" pageEncoding="utf-8"%>
二、瀏覽器與服務(wù)器傳輸數(shù)據(jù)亂碼處理
1、瀏覽器端編碼,一般由服務(wù)器端告訴瀏覽器如何解碼數(shù)據(jù):
1.1、Servlet
response.setContentType("text/html; charset=UTF-8"); 或者 response.setCharacterEncoding(“UTF-8”);
1.2、JSP
<%@ page language="java" contentType="text/html; charset=utf-8" %>
1.3、通用
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
1.4、Javascript傳參亂碼
在瀏覽器端對要傳遞的中文參數(shù)進行編碼處理.代碼如下:
xmlhttp.open("POST",url,true); //請求參數(shù)初始化
xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); //因為請求方式為POST,所以這里要設(shè)置請求頭.(如果請求方式為GET,此句代碼可以省略)
xmlhttp.send("name="+encodeURI(encodeURI("星期日"))); //向服務(wù)器端發(fā)送參數(shù)
在服務(wù)器端代碼:
頁面jsp保證是utf-8編碼
<%@ page contentType="text/html; charset=utf-8"%>
接受中文參數(shù)
PrintWriter out = response.getWriter(); //得到response的輸出流對象
String name1 = request.getParameter("name"); //得到KEY為"name"的請求參數(shù)
String name = URLDecoder.decode(name1,"utf-8"); //對得到的參數(shù)進行解碼
out.print(name); //向瀏覽器端發(fā)送數(shù)據(jù)
1.5、熱鏈接傳參亂碼
在傳參的jsp對中文進行編碼:href="new.jsp?name=java.net.URLEncoder.encode("鏈接")";
在接受的jsp對中文進行轉(zhuǎn)碼:String str = URLDecoder.decode(request.getParameter("name "), "utf-8");
注:瀏覽器編碼可以由我們手工修改,但最后不要這樣,一般讓瀏覽器自動選擇即可。
2、服務(wù)器端編碼,將客戶端傳過來的數(shù)據(jù)進行解碼:
瀏覽器默認使用ISO-8859-1進行編碼數(shù)據(jù),然后將數(shù)據(jù)傳輸?shù)椒⻊?wù)器,因此我們默認只需要將瀏覽器發(fā)送過來的數(shù)據(jù)轉(zhuǎn)換為我們需要的編碼即可。
2.1、最簡單方式:
String username = request.getParameter(“username”);
username = new String(username.getBytes("ISO-8859-1“), "UTF-8");
2.2、比較好的解決方案
// 必須在獲取參數(shù)之前,調(diào)用如下方法先解碼 request.setCharacterEncoding(“UTF-8”);
String username = request.getParameter(“username”);
2.3、比較通用方案:在一個Filter中更改所有請求的編碼方式:
A、在src中添加filter來設(shè)置編碼格式是中文,filter類可以在tomcat的包里面:apache-tomcat-6.0.16.zip\apache-tomcat-6.0.16\webapps\examples\WEB-INF\classes\filters下面,SetCharacterEncodingFilter.java文件
B、在web.xml中配置
filter,具體配置如下頁:
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>filters.SetCharacterEncodingFilter</filter-class>
<init-param><param-name>encoding</param-name>
<param-value>utf-8</param-value></init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2.4、GET提交方式中文亂碼解決
通過修改request.setCharacterEncoding(“UTF-8”);只能解決POST提交方式的請求編碼,對GET無效。
A、最簡單解決方案:
該解決方案不再需要任何額外配置(如filter) TOMCAT默認ISO-8859-1 因此可以設(shè)置默認編碼為UTF-8解決,在conf\server.xml文件中設(shè)置如下 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding=”UTF-8”/>
B、在tomcat4之后,可以通過如下配置來解決中文亂碼,但必須配置filter
在conf\server.xml文件中設(shè)置如下 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" useBodyEncodingForURI=“true”/>
然后request.setCharacterEncoding(“UTF-8”)也可解決GET亂碼
3、Java與數(shù)據(jù)庫之間的亂碼:
大部分數(shù)據(jù)庫都支持以unicode編碼方式,所以解決Java與數(shù)據(jù)庫之間的亂碼問題比較明智的方式是直接使用unicode編碼與數(shù)據(jù)庫交互。很多數(shù)據(jù)庫驅(qū)動自動支持unicode,如Microsoft的SQLServer驅(qū)動。其他大部分數(shù)據(jù)庫驅(qū)動,可以在驅(qū)動的url參數(shù)中指定,如mysql驅(qū)動:
jdbc:mysql://localhost/MYAPPS?useUnicode=true&characterEncoding=GBK。
或者使用JAVA程序,修改編碼,程序如下:
- public class Convert {
- public static String ISOtoGB(String iso){
- String gb;
- try{
- if(iso.equals("") || iso == null){
- return "";
- }
- else{
- iso = iso.trim();
- gb = new String(iso.getBytes("ISO-8859-1"),"GB2312");
- return gb;
- }
- }
- catch(Exception e){
- System.err.print("編碼轉(zhuǎn)換錯誤:"+e.getMessage());
- return "";
- }
- }
- }
復(fù)制代碼
4、Java與文件/流之間的亂碼:
Java讀寫文件最常用的類是FileInputStream / FileOutputStream和FileReader / FileWriter。其中FileInputStream和FileOutputStream是基于字節(jié)流的,常用于讀寫二進制文件。讀寫字符文件建議使用基于字符的FileReader和FileWriter,省去了字節(jié)與字符之間的轉(zhuǎn)換。但這兩個類的構(gòu)造函數(shù)默認使用系統(tǒng)的編碼方式,如果文件內(nèi)容與系統(tǒng)編碼方式不一致,可能會出現(xiàn)亂碼。在這種情況下,建議使用FileReader和FileWriter的父類:InputStreamReader / OutputStreamWriter,它們也是基于字符的,但在構(gòu)造函數(shù)中可以指定編碼類型:InputStreamReader(InputStream in, Charset cs) 和OutputStreamWriter(OutputStream out, Charset cs)。 |
|