說明:由於亂碼問題造成的原因可能有很多種,而且不同的環境下面,結果也不一樣。
本人[閉月羞花貓]一直致力於找出一套完整的,萬能的解決方案,希望各位能夠共同討論。
第一部分:
關於日文編碼,目前比較使用的比較多的是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>