關於JSP中日文亂碼問題的解決

來源:互聯網
上載者:User

說明:由於亂碼問題造成的原因可能有很多種,而且不同的環境下面,結果也不一樣。
本人[閉月羞花貓]一直致力於找出一套完整的,萬能的解決方案,希望各位能夠共同討論。

第一部分:
關於日文編碼,目前比較使用的比較多的是Shift_js和windows-31J.

Shift_js和windows-31J的區別,參見:http://blog.csdn.net/luyang1016/archive/2007/06/14/1652469.aspx

對於一般表單提交的亂碼,處理無非就是在jsp中加上3句話。

<%@ page language="java" contentType="text/html;charset=Windows-31J"%>
表示jsp的編碼是 Windows-31J

<meta http-equiv="Content-Type" content="text/html; charset=SJIS">
表示jsp上固定項目,是SJIS的,固定項目既然是固定字元,一般無需用Windows-31J

<% request.setCharacterEncoding("Windows-31J"); %>
一般項目會在自己封裝的 ActionServlt extends org.apache.struts.action.ActionServlet,中進行設定。

如果不進行上面的設定,在tomcat的環境中,request.getParameter("AAA"),如果AAA是日文漢字的話,必然產生亂碼。(tomcat預設的編碼是IS0-8859-1)。

以上處理,緊緊是最簡單的處理,據說可以通過web.xml的filter配置來進行管理的,如何配置web.xml,在文章最後提供了一個網友給出的答案。作用同我說的在自己封裝的 ActionServlt extends org.apache.struts.action.ActionServlet,中進行設定的效果是差不多的。

第二部分:
關於url裡面傳遞日文參數造成的亂碼問題解決方案

(可能在url裡傳遞的格式如果不指定的話和apserver預設的編碼是一致的,也就是如果我用的是tomcat的話,那麼我這裡傳遞url,編碼就是ISO-8859-1的)

(不知道websphere預設的是什麼,沒有調查過)

一般將所需要做的就是將URL進行URLEncoder ※

例子:     String param1= URLEncoder.encode( “陸楊”,"Windows-31J");
  
特別注意:  對於 encode過的字元集,一般來說是需要URLDecoder.decode(request.getParameter("param1"))解析之後才能使用的。
但是在struts中,直接在下一個畫面中使用,request.getParameter("param1"); 得到的結果還是"陸楊",可能是servlet內部已經轉換過了。

如果上面的解決方案不能解決你的問題,而且你有是使用tomcat作為Apserver的話,
可以嘗試一下下面的方法解決。(這個方法不推薦使用,因為最好程式還是不要依賴於apserver的配置)
           
方法如下:
在tomcat的server.xml中,加入URIEncoding="Windows-31J
  <!-- Define a non-SSL Coyote HTTP/1.1 Connector on the port specified during installation  -->
    <Connector   port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               debug="0" connectionTimeout="20000"
               disableUploadTimeout="true" URIEncoding="Windows-31J"/>

PS:在tomcat5系列中,通過get方式提交表單或者url方式傳遞日文參數,使用此法是可行的。post方式可以參照下面的過濾器的處理方式,或者我所說的自己重寫ActionServlet的方式來解決。

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※public class URLEncoderextends Object HTML 格式編碼的工具 + 生產力類。該類包含了將 String 轉換為 application/x-www-form-urlencoded MIME 格式的靜態方法。有關 HTML 格式編碼的更多資訊,請參閱 HTML 規範。

對 String 編碼時,使用以下規則:

 

字母數字字元 "a" 到 "z"、"A" 到 "Z" 和 "0" 到 "9" 保持不變。
特殊字元 "."、"-"、"*" 和 "_" 保持不變。
空白字元 " " 轉換為一個加號 "+"。
所有其他字元都是不安全的,因此首先使用一些編碼機制將它們轉換為一個或多個位元組。然後每個位元組用一個包含 3 個字元的字串 "%xy" 表示,其中 xy 為該位元組的兩位十六進位表示形式。推薦的編碼機制是 UTF-8。但是,出於相容性考慮,如果未指定一種編碼,則使用相應平台的預設編碼。
例如,使用 UTF-8 編碼機制,字串 "The string ü@foo-bar" 將轉換為 "The+string+%C3%BC%40foo-bar",因為在 UTF-8 中,字元 ü 編碼為兩個位元組,C3 (十六進位)和 BC (十六進位),字元 @ 編碼為一個位元組 40 (十六進位)。
 

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※完美解決方案。
做個過濾器。首先建立檔案
filter.CharacterEncodingFilter.java

然後寫入代碼
package Filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class CharacterEncodingFilter implements Filter {

 public void destroy() {
 }
 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  request.setCharacterEncoding("Windows-31J");
  chain.doFilter(request, response);
 }

 public void init(FilterConfig conf) throws ServletException { 
 }

}
然後修改設定檔web.xml
   <filter>
   <filter-name>CharacterEncodingFilter</filter-name>
   <filter-class>Filter.CharacterEncodingFilter</filter-class>
    <init-param>
    <param-name>encoding</param-name>
    <param-value>Windows-31J</param-value>
    </init-param>
  </filter>
    <filter-mapping>
   <filter-name>CharacterEncodingFilter</filter-name>
   <url-pattern>/*</url-pattern>
  </filter-mapping>

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.