更新時(shí)間:2021-09-06 11:05:25 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1325次
作為一個(gè)合格的web開(kāi)發(fā)人員應(yīng)該是什么問(wèn)題都遇到過(guò)的,尤其是亂碼問(wèn)題。大家也許都體會(huì)到了,我們中國(guó)人學(xué)編程,很大的一個(gè)不便就是程序的編碼問(wèn)題,無(wú)論學(xué)習(xí)什么技術(shù),我們都需要探討他的編碼問(wèn)題。
來(lái)講一下關(guān)于解決javaweb亂碼出現(xiàn)的原因與解決辦法。
首先,先明確兩個(gè)問(wèn)題,為什么會(huì)出現(xiàn)亂碼?我們?cè)诰帉?xiě)web應(yīng)用時(shí)什么時(shí)候會(huì)出現(xiàn)亂碼?
第一個(gè)問(wèn)題:很多初學(xué)者會(huì)發(fā)現(xiàn),我們?cè)谧约旱目蛻魴C(jī)上編寫(xiě)的web應(yīng)用程序時(shí),明明是正常的漢字,但是發(fā)布到服務(wù)器上訪問(wèn)的時(shí)候?yàn)g覽器就會(huì)看到亂碼。
出現(xiàn)這種問(wèn)題的原因是:通常中文windows系統(tǒng)中系統(tǒng)默認(rèn)的編碼是GBK(大家可以進(jìn)入DOS窗口下,輸入chcp進(jìn)行查詢),而我們編寫(xiě)web應(yīng)用時(shí),myeclipse默認(rèn)的編碼通常是iso8859-1,瀏覽器也會(huì)有自己的編碼選擇。。。這么多地方使用的不同編碼,如果兩個(gè)編碼不對(duì)口,當(dāng)然就會(huì)出現(xiàn)亂碼。
第二個(gè)問(wèn)題:出現(xiàn)亂碼的地方可以歸結(jié)為三類:1.基本jsp頁(yè)面顯示亂碼,2.表單提交亂碼,3.數(shù)據(jù)庫(kù)亂碼
下面為大家依次講解:
這種情況比較簡(jiǎn)一般只有初學(xué)者會(huì)出現(xiàn),原因是因?yàn)閖sp頁(yè)面保存,轉(zhuǎn)換時(shí)的編碼與瀏覽器解析的編碼不一樣。這里涉及到三個(gè)解決方案
(1)我們都知道,jsp就是servlet,jsp會(huì)轉(zhuǎn)換成servlet之后轉(zhuǎn)換為相關(guān)的java代碼再發(fā)給客戶端。
那么jsp中就需要有語(yǔ)句可以控制jsp是以什么編碼轉(zhuǎn)換為servlet的。上述編碼就是控制,jsp以UTF-8的編碼方式保存,也就是說(shuō)以UTF-8的編碼方式轉(zhuǎn)換成servlet。
(2)熟悉HTTP協(xié)議的朋友都不陌生這一句代碼,charset="UTF-8",就是設(shè)置響應(yīng)頭編碼方式為UTF-8。
(3)同上一句代碼,只不過(guò)這一句使用HTML控制瀏覽器解析方式。
示例:
我們?cè)谝粋€(gè)簡(jiǎn)單的jsp頁(yè)面中寫(xiě)下這樣的代碼,頁(yè)面中有漢字,卻默認(rèn)pageEncoding="iso8859-1"
<%@ page language="java" import="java.util.*" pageEncoding="iso8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
<form action="encoding.jsp" method="get">
username:<input type="text" name="name" /><br>
性別:<input type="text" name="sex" /><br>
<input type="submit" value="submit" />
</form>
</body>
</html>
頁(yè)面顯示:

HTTP報(bào)文請(qǐng)求頭:

大家只要按照上述修改響應(yīng)時(shí)的默認(rèn)編碼即可。
我們?cè)谑褂帽韱翁峤恢形臅r(shí)也會(huì)出現(xiàn)亂碼,原因就是Tomcat服務(wù)器內(nèi)部編碼默認(rèn)是iso8859-1,Tomcat會(huì)以編碼的缺省方式利用iso8859-1來(lái)解析中文。
表單get方式提交時(shí),服務(wù)器會(huì)用默認(rèn)的編碼對(duì)提交的數(shù)據(jù)進(jìn)行解析,并添加到url后面?zhèn)鞯较乱粋€(gè)頁(yè)面。
解決方法:在Tomcat 服務(wù)器的server.xml文件中進(jìn)行配置,在Connector節(jié)點(diǎn)中加入useBodyEncodingForURI="true" URIEncoding=”UTF-8”,這樣接收頁(yè)面就會(huì)利用UTF-8進(jìn)行解碼了。
表單post方式提交時(shí),提交的數(shù)據(jù)不再加入到url中,我們可以在web應(yīng)用中添加一個(gè)servlet過(guò)濾器來(lái)設(shè)置編碼統(tǒng)一(servlet過(guò)濾器會(huì)在訪問(wèn)設(shè)置的相關(guān)url之前執(zhí)行)。
過(guò)濾器相關(guān)代碼:
public class ConvertEncoding implements Filter {
private String encoding;
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
req.setCharacterEncoding(encoding);//設(shè)置請(qǐng)求編碼
resp.setContentType("text/html;charset="+encoding);//設(shè)置響應(yīng)編碼
chain.doFilter(req,resp);
}
@Override
public void init(FilterConfig config) throws ServletException {
this.encoding = config.getInitParameter("encoding");//讀取默認(rèn)編碼
}
}
這樣我們會(huì)發(fā)現(xiàn)即使是post方式提交的數(shù)據(jù),也不會(huì)出現(xiàn)亂碼情況。、
對(duì)于大多數(shù)數(shù)據(jù)庫(kù)的JDBC驅(qū)動(dòng)程序,在Java程序和數(shù)據(jù)庫(kù)之間傳遞數(shù)據(jù)都是以ISO8859-1為默認(rèn)編碼格式,所以,在程序中向數(shù)據(jù)庫(kù)存儲(chǔ)包含中文的數(shù)據(jù)時(shí),驅(qū)動(dòng)程序受限把程序內(nèi)部Unicode編碼格式的數(shù)據(jù)轉(zhuǎn)換為ISO8859-1編碼,然后傳遞到數(shù)據(jù)庫(kù)中,如果要解決數(shù)據(jù)庫(kù)亂碼問(wèn)題,最簡(jiǎn)單的就是更改數(shù)據(jù)庫(kù)默認(rèn)編碼格式。
以上就是動(dòng)力節(jié)點(diǎn)小編介紹的"解決JavaWeb亂碼問(wèn)題的方法",希望對(duì)大家有幫助,想了解更多可查看JavaWeb教程。動(dòng)力節(jié)點(diǎn)在線學(xué)習(xí)教程,針對(duì)沒(méi)有任何Java基礎(chǔ)的讀者學(xué)習(xí),讓你從入門(mén)到精通,主要介紹了一些Java基礎(chǔ)的核心知識(shí),讓同學(xué)們更好更方便的學(xué)習(xí)和了解Java編程,感興趣的同學(xué)可以關(guān)注一下。
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)