天天看點

java中Servlet處理亂碼

今天在部署一個webservices程式的時候,從頁面擷取資料的servlet出現了亂碼問題,在servlet中我已經把request.setCharacterEncoding("GB2312");這段文字加入到代碼中去,但是還是出現亂麻問題。

 到網上找資料,如下:JAVA是Unicode編碼,你先轉換成ISO8859-1,然後再轉換成GBK或是GB2312.

java 代碼

request.setCharacterEncoding("ISO8859-1");    

ad=request.getParameter("name");    

byte[] temp3 = ad.getBytes("GBK");    

String str = new String(temp3);   

這樣就是中文啦! 

還有一種更簡單的方法,就是直接在伺服器裡設定編碼轉換。用的是TOMCAT5.0.28。 

在..\Tomcat   5.0\conf目錄裡找到SERVER.XML檔案,用寫字闆打開它,設定如下: 

裡面增加一個屬性就可以了,URIEncoding="GBK"

測試通過,搞定,然後就是request.setCharacterEncoding("GB2312")這句話到底起了什麼作用,如果它不能解決亂麻問題,我們用它來起什麼作用,整理資料如下:

    (一) JSP頁面上是中文,但是看的是後是亂碼:

解決的辦法就是在JSP頁面的編碼的地方,因為Jsp轉成Java檔案時的編碼問題,預設的話有的伺服器是ISO-8859-1,如果一個JSP中直接輸入了中文,Jsp把它當作 ISO8859-1來處理是肯定有問題的,這一點,我們可以通過檢視Jasper所生成的Java中間檔案來确認

(二) 當用Request對象擷取客戶送出的漢字代碼的時候,會出現亂碼:

解決的辦法是:要配置一個filter,也就是一個Servelet的過濾器,代碼如下:

public void doFilter(ServletRequest request, ServletResponse response,

FilterChain chain)throws IOException, ServletException {

request.setCharacterEncoding("GBK");

// 傳遞控制到下一個過濾器

chain.doFilter(request, response);

}

配置web.xml

<filter></filter>

<filter-name></filter-name>Set Character Encoding

<filter-class></filter-class>SetCharacterEncodingFilter

<filter-mapping></filter-mapping>

<url-pattern></url-pattern>/*

如果你的還是出現這種情況的話你就往下看看是不是你出現了第四中情況,你的Form送出的資料是不是用get送出的,一般來說用post送出的話是沒有問題的,如果是的話,你就看看第四中解決的辦法。

還有就是對含有漢字字元的資訊進行處理,處理的代碼是:

public String toUni(String gbStr){

String uniStr = "";

if(gbStr == null){

gbStr = "";

try{

byte[] tempByte = gbStr.getBytes("GB2312");

uniStr = new String(tempByte,"ISO8859_1");

}catch(Exception ex){

return uniStr;

你也可以在直接的轉換,首先你将擷取的字元串用ISO-8859-1進行編碼,然後将這個編碼存放到一個位元組數組中,然後将這個數組轉化成字元串對象就可以了,例如:

String str=request.getParameter(“girl”);

Byte B[]=str.getBytes(“ISO-8859-1”);

Str=new String(B);

通過上述轉換的話,送出的任何資訊都能正确的顯示。

(三) 在 Formget請求在服務端用request. getParameter(“name”)時傳回的是亂碼;按tomcat的做法設定Filter也沒有用或者用 request.setCharacterEncoding("GBK");也不管用問題是出在處理參數傳遞的方法上:如果在servlet中用 doGet(HttpServletRequest request, HttpServletResponse response)方法進行處理的話前面即使是寫了:

response.setContentType("text/html;charset=GBK");

也是不起作用的,傳回的中文還是亂碼!!!如果把這個函數改成doPost(HttpServletRequest request, HttpServletResponse response)一切就OK了。

同樣,在用兩個JSP頁面處理表單輸入之是以能顯示中文是因為用的是post方法傳遞的,改成get方法依舊不行。

由此可見在servlet中用doGet()方法或是在JSP中用get方法進行處理要注意。這畢竟涉及到要通過浏覽器傳遞參數資訊,很有可能引起常用字元集的沖突或是不比對。

//這個地方了解為request.setCharacterEncoding("GBK");set的是request中的body,而不是header部分,get請求時把參數放在url後邊,不是放在body中,是以這個時候request.setCharacterEncoding("GBK")就沒有起到作用,換到post送出就沒有問題了,經測試通過,

java中Servlet處理亂碼
java中Servlet處理亂碼

!!

解決的辦法是:

1) 打開tomcat的server.xml檔案,找到區塊,加入如下一行:

URIEncoding=”GBK”

完整的應如下:

<connector uriencoding="GBK" maxthreads="150" debug="0" redirectport="8443" port="8080" enablelookups="false" maxsparethreads="75" minsparethreads="25" connectiontimeout="20000" disableuploadtimeout="true" acceptcount="100"></connector>

2)重新開機tomcat,一切OK。

tomact.org給的解釋

This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, ISO-8859-1 will be used. 也就是說轉換了URI的bytes,request.setCharacterEncoding("GBK")把request也轉換了,問題就ok了!

(四) JSP頁面上有中文,按鈕上面也有中文,但是通過伺服器檢視頁面的時候出現亂碼:

解決的辦法是:首先在JSP檔案中不應該直接包含本地化的消息文本,而是應該通過<bean:message>标簽從Resource Bundle中獲得文本。應該把你的中文文本放到Application.properties檔案中,這個檔案放在WEB-INF/classes/* 下,例如我在頁面裡有姓名,年齡兩個label,我首先就是要建一個Application.properties,裡面的内容應該是name=”姓名” age=”年齡”,然後我把這個檔案放到WEB-INF/classes/properties/下,接下來根據 Application.properties檔案,對他進行編碼轉化,建立一個中文資源檔案,假定名字是 Application_cn.properties。在JDK中提供了native2ascii指令,他能夠實作字元編碼的轉換。在DOS環境中找到你放置Application.properties的這個檔案的目錄,在DOS環境中執行一下指令,将生成按GBK編碼的中文資源檔案 Application_cn.properties:native2ascii ?encoding gbk Application.properties Application_cn.properties執行以上指令以後将生成如下内容的Application_cn.properties檔案: name=u59d3u540d age=u5e74u9f84,在Struts-config.xml中配置:<message-resources parameter="properties.Application_cn"></message-resources>。到這一步,基本上完成了一大半,接着你就要在JSP頁面上寫,到名字的那個label是要寫<bean:message key="”name”">,這樣的化在頁面上出現的時候就會出現中文的姓名,年齡這個也是一樣,按鈕上漢字的處理也是同樣的。 

(五) 寫入到資料庫是亂碼:

解決的方法:要配置一個filter,也就是一個Servelet的過濾器,代碼如同第二種時候一樣。

如果你是通過JDBC直接連結資料庫的時候,配置的代碼如下:jdbc:mysql://localhost:3306/workshopdb? useUnicode=true&characterEncoding=GBK,這樣保證到資料庫中的代碼是不是亂碼。

如果你是通過資料源連結的化你不能按照這樣的寫法了,首先你就要寫在配置檔案中,在tomcat 5.0.19中配置資料源的地方是在C:Tomcat 5.0confCatalinalocalhost這個下面,我建立的工程是workshop,放置的目錄是webapp下面,workshop.xml 的配置檔案如下:

<context debug="0" path="/workshop" docbase="workshop"></context>reloadable="true" >

<resource name="jdbc/WorkshopDB"></resource>auth="Container"

type="javax.sql.DataSource" />

<resourceparams name="jdbc/WorkshopDB"></resourceparams>

<parameter></parameter> 

<name></name>factory

<value></value>org.apache.commons.dbcp.BasicDataSourceFactory

<name></name>maxActive

<value></value>100

<name></name>maxIdle

<value></value>30

<name></name>maxWait

<value></value>10000

<name></name>username

<value></value>root

<name></name>password

<value></value>

<name></name>driverClassName

<value></value>com.mysql.jdbc.Driver

<name></name>url

粗體的地方要特别的注意,和JDBC直接連結的時候是有差別的,如果你是配置正确的化,當你輸入中文的時候到資料庫中就是中文了,有一點要注意的是你在顯示資料的頁面也是要用這行代碼的。需要注意的是有的前台的人員在寫代碼的是後用Dreamver寫的,寫了一個Form的時候把他改成了一個jsp,這樣有一個地方要注意了,那就是在Dreamver中Action的送出方式是request的,你需要把他該過來,因為在jsp的送出的過程中緊緊就是POST和 GET兩種方式,但是這兩種方式送出的代碼在編碼方面還是有很大不同的,這個在後面的地方進行說明。</bean:message>< /bean:message>

上一篇: 字元串比較
下一篇: 字元串反轉