整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          Java Jsp中文亂碼解決方法

          Java Jsp中文亂碼解決方法

          從接觸Java和JSP以來,就不斷與Java的中文亂碼問題打交道,現在終于得到了徹底的解決,現將我們的解決心得與大家共享。

          一、Java中文問題的由來

          Java的內核和class文件是基于unicode的,這使Java程序具有良好的跨平臺性,但也帶來了一些中文亂碼問題的麻煩。原因主要有兩方面,Java和JSP文件本身編譯時產生的亂碼問題和Java程序于其他媒介交互產生的亂碼問題。

          首先Java(包括JSP)源文件中很可能包含有中文,而Java和JSP源文件的保存方式是基于字節流的,如果Java和JSP編譯成class文件過程中,使用的編碼方式與源文件的編碼不一致,就會出現亂碼。

          基于這種亂碼,建議在Java文件中盡量不要寫中文(注釋部分不參與編譯,寫中文沒關系),如果必須寫的話,盡量手動帶參數-ecoding GBK或-ecoding gb2312編譯;對于JSP,在文件頭加上<%@ page contentType="text/html;charset=GBK"%>或<%@ page contentType="text/html;charset=gb2312"%>基本上就能解決這類亂碼問題。

          本文要重點討論的是第二類亂碼,即Java程序與其他存儲媒介交互時產生的亂碼。

          很多存儲媒介,如數據庫,文件,流等的存儲方式都是基于字節流的,Java程序與這些媒介交互時就會發生字符(char)與字節(byte)之間的轉換,例如從頁面提交表單中提交的數據在Java程序里顯示亂碼等情況。

          如果在以上轉換過程中使用的編碼方式與字節原有的編碼不一致,很可能就會出現亂碼。

          二、解決方法

          對于流行的Tomcat來說,有以下兩種解決方法:

          1) 更改 D:\Tomcat\conf\server.xml,指定瀏覽器的編碼格式為“簡體中文”:

          方法是找到 server.xml 中的

          <Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"

          enableLookups="false" redirectPort="8443" acceptCount="100"

          connectionTimeout="20000" disableUploadTimeout="true" URIEncoding='GBK' />

          西安尚學堂 http://www.xasxt.com/

          Java零基礎就業班

          上課地址:陜西省西安市高新區科技二路西安軟件園天澤大廈五樓

          咨詢電話:029-62258374 QQ 2145598324

          招生對象:

          1. 零計算機編程基礎學

          2. 對行業不滿意人士

          3. 跨專業編程愛好者

          4. 在校大學生實訓

          Java零基礎班,10年 Java 以上開發經驗技術講師、架構師、行業大牛,親自純面授課程,手把手教你寫編程。

          10月新班免費試聽課程已就緒,7天免費聽課,體驗Java樂趣。

          sp中四種傳遞參數的方法,我覺得總結一下,挺好的,以備后用!

          1、form表單

          2、request.setAttribute();和request.getAttribute();

          3、超鏈接:<a herf="index.jsp"?a=a&b=b&c=c>name</a>

          1、form表單

          form.jsp:

          <%@page contentType="text/html; charset=GB2312"%> 
          <html> 
           <head> 
           <title> 
           form.jsp file 
           </title> 
           </head> 
           
           <body style="background-color:lightblue"> 
           
           <h2 style="font-family:arial;color:red;font-size:25px;text-align:center">登錄頁面</h2> 
           
           <form action="result.jsp" method="get" align="center"> 
           姓名:<input type="text" name="name" size="20" value="" maxlength="20"><br/> 
           
           密碼:<input type="password" name="password" size="20" value="" maxlength="20"><br/> 
           
           <!--在愛好前空一個空格,是為了排版好看些--> 
           
           愛好:<input type="checkbox" name="hobby" value="唱歌">唱歌 
           <input type="checkbox" name="hobby" value="足球">足球 
           <input type="checkbox" name="hobby" value="籃球">籃球<br/><br/> 
           
           <input type="submit" name="submit" value="登錄"> 
           <input type="reset" name="reset" value="重置"><br/> 
           </form> 
           
           </body> 
          </html>
          

          result.jsp:

           1 <%@page language="java" import="java.util.*" pageEncoding="GB2312"%> 
           2 <html> 
           3 <head> 
           4 <title> 
           5 result.jsp file 
           6 </title> 
           7 </head> 
           8 
           9 <body bgcolor="ffffff"> 
          10 <% 
          11 request.setCharacterEncoding("GB2312"); 
          12 
          13 String name=request.getParameter("name"); 
          14 name=new String(name.getBytes("iso-8859-1"),"GB2312"); 
          15 
          16 String pwd=request.getParameter("password"); 
          17 String[] hobby=request.getParameterValues("hobby");//注意這里的函數是getParameterValues()接受一個數組的數據 
          18 
          19 %> 
          20 
          21 <% 
          22 if(!name.equals("") && !pwd.equals("")) 
          23 { 
          24 %> 
          25 
          26 您好!登錄成功!<br/> 
          27 姓名:<%=name%><br/> 
          28 密碼:<%=pwd%><br/> 
          29 愛好:<% 
          30 for(String ho: hobby) 
          31 { 
          32 ho=new String(ho.getBytes("iso-8859-1"),"GB2312"); 
          33 out.print(ho+" "); 
          34 } 
          35 %> 
          36 <% 
          37 } 
          38 else 
          39 { 
          40 %> 
          41 請輸入姓名或密碼! 
          42 <% 
          43 } 
          44 %> 
          45 </body> 
          46 </html>
          

          注意:form表單的提交方式為get,在參數傳遞時會遇到中文亂碼的問題,一個簡單的解決方法是,將接受到的字符串先轉換成一個byte數組,再用String構造一個新的編碼格式的String,如:

          1 String name=request.getParameter("name"); 
          2 name=new String(name.getBytes("iso-8859-1"),"GB2312"); 
          

          如果form表單的提交方式為post,解決亂碼問題的簡單辦法是,使用 request.setCharacterEncoding("GB2312");設置request的編碼方式。

          為什么會出現中文亂碼問題呢?因為Tomcat服務器默認的系統編碼方式為iso- 8859-1,你傳遞參數給服務器時,使用的是默認的iso-8859-1的編碼方式,但是服務器向你返回信息時,是按page指令中設置的編碼方式, 如:<%@page language="java" import="java.util.*" pageEncoding="GB2312"%>,這樣就混合了兩種編碼方式,所以會出現亂碼,所以解決之道就是統一傳遞和接收的編碼方式。

          2、request.setAttribute()和request.getAttribute()

          set.jsp:

          <%@page contentType="text/html; charset=GB2312"%> 
          <html> 
           <head> 
           <title> 
           set.jsp file 
           </title> 
           </head> 
           
           <body style="background-color:lightblue"> 
           <% 
           request.setAttribute("name","心雨"); 
           %> 
           <jsp:forward page="get.jsp"/> 
           </body> 
          </html>
          

          get.jsp:

          <%@page contentType="text/html; charset=GB2312"%> 
          <html> 
           <head> 
           <title> 
           get.jsp file 
           </title> 
           </head> 
           
           <body style="background-color:lightblue"> 
           <% 
           out.println("傳遞過來的參數是:"+request.getAttribute("name")); 
           %> 
           </body> 
          </html> 
          

          request.setAttribute()和request.getAttribute()是配合<jsp:forward>或是include指令來實現的。

          3、超鏈接:<a herf="index.jsp?a=a&b=b&c=c">name</a>

          href.jsp:

          <%@page contentType="text/html; charset=GB2312"%> 
          <html> 
           <head> 
           <title> 
           href.jsp file 
           </title> 
           </head> 
           
           <body style="background-color:lightblue"> 
           <a href="getHerf.jsp?name=心雨&password=123">傳遞參數</a> 
           </body> 
          </html> 
          

          getHref.jsp:

          <%@page contentType="text/html; charset=GB2312"%> 
          <html> 
           <head> 
           <title> 
           getHref.jsp file 
           </title> 
           </head> 
           
           <body style="background-color:lightblue"> 
           <% 
           String name=request.getParameter("name"); 
           name=new String(name.getBytes("iso-8859-1"),"gb2312"); 
           
           out.print("name:"+name); 
           %> 
           <br/> 
           <% 
           out.print("password:"+request.getParameter("password")); 
           %> 
           </body> 
          </html> 
          

          這種傳遞參數的方法和form表單的get方式類似,是通過地址欄傳遞的參數,其亂碼解決方法也和form 的get方式一樣。

          4、<jsp:param>

          param.jsp:

          <%@page contentType="text/html; charset=GB2312"%> 
          <html> 
           <head> 
           <title> 
           param.jsp file 
           </title> 
           </head> 
           
           <body style="background-color:lightblue"> 
           
           <%request.setCharacterEncoding("GB2312");%> 
           
           <jsp:forward page="getParam.jsp"> 
           <jsp:param name="name" value="心雨"/> 
           <jsp:param name="password" value="123"/> 
           </jsp:forward> 
           
           </body> 
          </html>
          

          getParam.jsp:

          <%@page contentType="text/html; charset=GB2312"%> 
          <html> 
           <head> 
           <title> 
           getParam.jsp file 
           </title> 
           </head> 
           
           <body style="background-color:lightblue"> 
           <% 
           String name=request.getParameter("name"); 
           out.print("name:"+name); 
           %> 
           <br/> 
           <% 
           out.print("password:"+request.getParameter("password")); 
           %> 
           </body> 
          </html> 
          

          這里發現了一個奇怪的問題,還是在中文亂碼的問題上,在form表單的例子中,如果傳遞方式為post,則只需要在接收參數的頁面設置request的編 碼方式就可以了,即request.setCharacterEncoding("GB2312");,注意是在接收參數的頁面,如果將該句放到form 表單里,那么不起作用,仍然是亂碼。而在本例中,為了使傳遞的參數不出現亂碼,卻是將 request.setCharacterEncoding("GB2312");放在發送參數的頁面中,才會正常顯示中文,放在接收參數的頁面中,不起 作用。也許這就是<jsp:param>和form表單傳遞參數不同的地方。為什么會有這個不同呢?可能是因為form表單中的參數是由客戶 端傳送到服務端上的,需要經過一個request的打包過程,但是<jsp:param>傳遞的參數本身就是在服務器端的,不需要經歷由客戶 端到服務端這么一個過程,但是服務器里的參數傳遞是這么回事呢?這個問題,我不知道了!真是知識是一個擴大的圓圈,你知道的越多,那么不知道的就越多!努 力吧!

          .響應亂碼

          響應回來的數據存在中文亂碼問題

          解決方案

          可以設置響應數據的格式

           response.setContentType("text/html;charset=utf-8")

          告訴瀏覽器以什么樣的格式對響應的數據進行解析

          指定了響應數據的格式類型

          其值有兩部分

          • text/html:響應的數據是一個HTML文本
          • charset=utf-8:響應的數據的字符集是UTF-8的

          2.請求亂碼

          在獲取請求的時候出現了亂碼

          不同的請求數據的解析方式不同

          即亂碼的處理方式也不同

          • post請求

          數據的傳遞是通過請求體進行傳遞的

          數據的解析是由開發人員在后臺進行解析的

          解決方案

          在后臺解析數據時指定解析編碼

          告訴服務器,以什么樣的編碼對請求中的數據進行解析

          request..setCharacterEncoding("指定編碼")
          • get請求

          所有的解析是直接由服務器進行操作的,其默認字符集為:ISO-8859-1

          其解決方案有兩種

          方式一:

          字符集的轉換

          將ISO-8859-1的字符串轉換成指定編碼的字符串

          假設需要轉換的變量為name

          name=new String(name.getBytes("ISO8859-1"),"UTF-8");

          此時轉換成功,但是該方式需要對每一個字符串都進行轉換

          相對比較麻煩

          方式二

          更改服務器默認字符集

          將默認的ISO-8859-1改為我們想要的編碼

          打開tomcat安裝目錄下的conf目錄中的server.xml文件

          找到端口號配置的位置

          在端口號配置的標簽的屬性部分新增一個屬性

          URIEncoding="指定編碼"

          屬性名大小寫敏感

          表示指定當前服務器所使用的字符集

          <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>

          3.頁面亂碼

          頁面亂碼分為兩種情況

          • HTML頁面亂碼<meta charset="指定編碼"/>
          • JSP頁面亂碼:在JSP的page指令中指定響應格式
          <%@ page contentType="text/html;charset=UTF-8" %>

          4.JDBC亂碼

          在實現JDBC操作的時候,也存在亂碼問題

          需要指定當前操作的模式

           ?useUnicode=true&characterEncoding=utf-8

          在某些引用中,需要指定對應的時區

          例如:在SpringBoot中操作JDBC出現亂碼時

          需要指定時區

          ?characterEncoding=utf-8&serverTimezone=UTC

          5.數據庫亂碼

          在創建數據庫的時候,需要指定當前所使用的編碼

          在數據庫執行的時候,字符集中不能帶有-

          例如:UTF-8必須簡寫為UTF8

           engine=Innodb default charset=UTF8

          主站蜘蛛池模板: 日本中文一区二区三区亚洲| 日韩在线视频不卡一区二区三区| 国精品无码一区二区三区在线| 国产成人精品一区二区三区免费 | 青青青国产精品一区二区| 久久精品国产AV一区二区三区| 精品视频一区在线观看| 91在线一区二区| 中文字幕一区二区视频| 亚洲av色香蕉一区二区三区| 亚洲一区二区三区AV无码| 国产成人一区二区三区| 久久国产精品无码一区二区三区| 免费国产在线精品一区| 色婷婷香蕉在线一区二区| 另类免费视频一区二区在线观看| 成人免费视频一区二区三区| 色欲精品国产一区二区三区AV| 一区二区三区视频免费观看| 日本一区二区三区免费高清| 亚洲AV无码一区二区乱孑伦AS| 无码国产亚洲日韩国精品视频一区二区三区| 色欲AV蜜臀一区二区三区| 中文字幕无码一区二区免费 | 亚洲一区二区三区在线| 久久国产午夜精品一区二区三区 | 久久精品国产一区二区三区肥胖| 激情综合丝袜美女一区二区| 欧美日韩一区二区成人午夜电影 | 亚洲一区二区三区自拍公司| 武侠古典一区二区三区中文| 国精产品一区一区三区有限公司| 久久综合亚洲色一区二区三区| 亚洲av一综合av一区| 国产亚洲日韩一区二区三区 | 久久精品人妻一区二区三区| 午夜视频久久久久一区| 秋霞日韩一区二区三区在线观看 | 国产精品一区二区久久| 无码人妻精品一区二区在线视频 | 人妻久久久一区二区三区|