日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Java Web项目中解决中文乱码方法总结

發(fā)布時(shí)間:2025/7/14 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java Web项目中解决中文乱码方法总结 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、了解常識(shí):

?

??????1.UTF-8國(guó)際編碼,GBK中文編碼。GBK包含GB2312,即如果通過GB2312編碼后可以通過GBK解碼,反之可能不成立;

??????2、web tomcat:默認(rèn)是ISO8859-1,不支持中文的

??????3.java.nio.charset.Charset.defaultCharset()?獲得平臺(tái)默認(rèn)字符編碼;

??????4.getBytes() 是通過平臺(tái)默認(rèn)字符集進(jìn)行編碼;

二、引入

?

??????在學(xué)習(xí)任何一門技術(shù)時(shí),經(jīng)常會(huì)有初學(xué)者遇到中文亂碼問題,比如MySQL,是因?yàn)樵诎惭b時(shí)沒有設(shè)置;而在Servlet中,也會(huì)遇到中文亂碼問題;

??????比如:

??????OutputStream?out =?response.getOutputStream();

??????out.write(String );

??????輸出中文時(shí)可能會(huì)出現(xiàn)亂碼;

??????比如:

protected?void?doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { OutputStream out = response.getOutputStream(); String data = "博客"; out.write(data.getBytes("UTF-8"));

??????輸出亂碼的問題是程序用UTF-8編碼,而瀏覽器默認(rèn)用GBK解碼了,因此會(huì)出現(xiàn)亂碼;

三、Servlet相關(guān)的幾種亂碼

?

??????1、瀏覽器調(diào)用jsp,html等頁面中文顯示亂碼

??????此情況需滿足兩個(gè)要求:

??????(1)文件本身是以u(píng)tf-8編輯保存的(myEclipse中在properties中鼠標(biāo)右鍵選擇utf-8)

??????(2)瀏覽器用utf-8解析:

??????(手動(dòng))==> 在瀏覽器中右鍵選擇編碼格式為utf-8

??????(智能)==> 在文件中寫入如:?<meta http-equiv="content-type" content="text/html; charset=UTF-8"> ?通過<meta>標(biāo)簽?zāi)Mresponse頭,起到告訴瀏覽器用utf-8的編碼解析

??????(智能)==>?response.setContentType("text/html;charset=UTF-8");起到告訴瀏覽器用utf-8的編碼解析

??????常用:

??????<meta name="content-type" content="text/html; charset=UTF-8">或<meta charset="utf-8">

??????<%@ pageEncoding="utf-8"%>

??????<?xml encoding="UTF-8"?>

?

??????2、通過瀏覽器調(diào)用servlet,頁面顯示亂碼。

??????Servlet亂碼分為request亂碼和response亂碼;

(1)response亂碼問題

??????解決方法:

??????在網(wǎng)上很有效的解決方法是添加:

??????response.setCharacterEncoding("UTF-8");

??????解決不了,后來又搜到一條解決方法是:

??????response.setContentType("text/html;charset=utf-8");或者?response.setHeader("content-type","text/html;charset=UTF-8");告訴瀏覽器用utf-8解析。(setHeader是HttpServletResponse的方法。如果想在攔截器Filter中設(shè)置字符編碼,則無此方法,因?yàn)镕ilter的doFilter方法的參數(shù)類型是ServletResponse)

??????兩句都填上,后來終于解決了這個(gè)問題;

??????其實(shí)我們應(yīng)該思考一下本質(zhì):

??????response.setContentType("text/html;charset=UTF-8");?目的是為了控制瀏覽器的行為,即控制瀏覽器用UTF-8進(jìn)行解碼;

??????response.setCharacterEncoding("UTF-8");目的是用于response.getWriter()輸出的字符流的亂碼問題。如果是response.getOutputStream()是不需要此種解決方案的,因?yàn)檫@句話的意思是為了將response對(duì)象中的數(shù)據(jù)以UTF-8解碼后的字節(jié)流發(fā)向?yàn)g覽器;

??????==>?情況一:

??????問題代碼如【引入】的例子

??????我們這里先來說明一下錯(cuò)誤的原因,下圖是顯示亂碼的流程圖:

?

??????解決方案流程圖:

?

??????==>情況二:

??????問題代碼如下

protected?void?doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); String data = "博客"; out.println(data); }

??????瀏覽器輸出的結(jié)果為: ??

??????原因:"博客"首先被封裝在response對(duì)象中,因?yàn)镮E和WEB服務(wù)器之間不能傳輸文本,然后就通過ISO-8859-1進(jìn)行編碼,但是ISO-8859-1中沒有“博客”的編碼,因此輸出“??”表示沒有編碼;?

??????錯(cuò)誤代碼流程圖:

?

??????而解決方案是:response.setCharacterEncoding("GB2312"); 設(shè)置response使用的碼表?

??????解決方案流程圖:

?

(2)request亂碼問題

??????request請(qǐng)求分為post和get,對(duì)于不同的請(qǐng)求方式有不同的解決亂碼的方案;

??????==>POST請(qǐng)求:

??????錯(cuò)誤原因:

?

??????解決方案:

?

?

??????==>GET請(qǐng)求(URI方式傳遞參數(shù)亂碼):

??????出現(xiàn)情況:瀏覽器訪問<a href=""><form method="get">

??????如:<a href="/webproject/display.jsp?username=張三&password=123">顯示用戶名和密碼</a>

??????解決方法:問題本質(zhì)是get方式傳遞的參數(shù)內(nèi)容默認(rèn)編碼方式問ISO8859-1,而且使用request.setCharacterEncoding("utf-8")也無法解決問題。

??????法一:要解決這個(gè)問題,修改tomcat服務(wù)器的配置文件。修改tomcat目錄下的conf/server.xml文件的第43行:

??????修改前內(nèi)容:

??????<Connector port="8080" protocol="HTTP/1.1"

??????maxThreads="150"?? connectionTimeout="200000"

??????redirecPort="8443"/>

??????修改后內(nèi)容:

??????<Connector port="8080" protocol="HTTP/1.1"

??????maxThreads="150"?? connectionTimeout="200000"

??????redirecPort="8443"??? URIEncoding="utf-8"/>

??????法二:String usernameString = new String(username.getBytes("ISO-8859-1"),"UTF-8"); (如下圖)
??????法三:URL轉(zhuǎn)換?

?

?

??????3、調(diào)用數(shù)據(jù)庫(kù)出現(xiàn)亂碼

??????安裝數(shù)據(jù)的時(shí)候選擇UTF-8

四、JSP相關(guān)亂碼解決方案(部分已經(jīng)在上面介紹了)

??????問題描述:通過jsp,html,或servlet中的表單元素把參數(shù)提交給對(duì)應(yīng)的jsp或者servlet時(shí),在接收的jsp或servlet中接收到的參數(shù)中文顯示亂碼。

??????例如:

??????提交jsp代碼如下:

??????<%@ page language="java" pageEncoding="utf-8"%>

??????<html>

??????<head>

??????<title>輸入表單</title>

??????</head>

??????<body>

??????<form id="inputForm" name="inputForm" method="post" action="display.jsp">

??????用戶名:<input type="text" name="username"/><br/>

??????密?? 碼? :<input type="password" name="password"/><br/>

??????<input type="submit" name="submit" value="提交"/>

??????</form>

??????</body>

??????</html>

??????接收參數(shù)的jsp代碼如下:

??????<% @? page language="java" pageEncoding="utf-8"%>

??????<html>

??????<head>

??????<tilte>接收表單</title>

??????</head>

??????<body>

??????<% 在這里插入

??????request.setCharacterEncoding("utf-8");

??????%>

??????用戶名:<%=request.getParameter("username")%><br/>

??????密???? 碼:<%=request.getParameter("password")%><br/>

??????</body>

??????</html>

??????解決方法:在接收post提交的參數(shù)前,使用request.setCharacterEncoding("utf-8")設(shè)定接收參數(shù)的內(nèi)容格式為utf-8編碼。見接收表單中的插入內(nèi)容即可。當(dāng)然這種亂碼問題最好使用中文過濾器的方法最好。

五、properties文件亂碼

?

??????問題描述:在使用一些類庫(kù)或者框架時(shí),為了實(shí)現(xiàn)頁面內(nèi)容國(guó)際化,需要編寫對(duì)應(yīng)的properties文件。而properties文件中的中文內(nèi)容在顯示的時(shí)候也會(huì)出現(xiàn)亂碼。

??????解決方法:這個(gè)亂碼問題可以通過jdk中的native2ascii工具解決。使用如下命令:

??????native2ascii?? -encoding?? utf-8? display.properties??? display_zh_CN.properties

??????出現(xiàn)亂碼問題的原因是因?yàn)閖ava編譯器只能處理Latin-1或unicode編碼的字符文件。

轉(zhuǎn)載于:https://www.cnblogs.com/BelieveFish/p/8818906.html

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的Java Web项目中解决中文乱码方法总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。