javaWeb專案亂碼分析和解決
設定檔案的儲存編碼格式,這個一般在新建專案時,設定了GBK的編碼格式,這時檔案的頁面編碼格式是GBK的,而儲存格式是ANSI的,後來把專案及檔案的編碼格式改為utf-8的編碼格式後,依然出現中文亂碼,這就是因為已經存在的檔案的儲存編碼格式還是ANSI把致,所以要把以前的.java檔案的儲存格式更改為utf-8,才不會出現中文註釋亂碼問題
window-preferences-General-Content Types 在Text下選擇對應的檔案型別再改頁面編碼為UTF-8然後點Update就可以了。
注:
如果是一個全新的工作空間,設定Myeclipse的編碼格式,就等於設定了專案,檔案及其儲存的編碼格式了(不包含jsp等檔案)
如果是一個已經存在的工作間,而原來的編碼格式為GBK,那麼更改工作空間的編碼,則相當於設定了專案,檔案的編碼格式,但是對於以前已經存在的.java檔案,其儲存編碼是改變不了的,必須按上面(4)去更改,但是對於將要新建的檔案的儲存編碼是有作用的
亂碼要檢查的幾個地方
1.儲存的編碼
2.jsp裡宣告的編碼(UTF-8和utf8是一樣的)
注意:<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
3.過濾器裡處理的字元編碼,僅限於輸入的輸出的資料編碼。而上面那句程式碼中設的編碼格式是頁面的顯示格式。
一份javaweb的專案程式碼中,總共有這幾種格式:
1.程式碼的儲存格式2.瀏覽器的解析格式3.資料輸入時的格式(也就是瀏覽器的解析格式決定)4.資料處理時的格式。
原則上以上六種格式都要一樣,就絕對不會亂碼,但有一些特殊情況,其中有一些不一致,顯示也會正確,如不需要將輸入的內容進行顯示和處理時request和respose的格式可以與其他的格式不一致,ps:常用編碼ISO-8859-1,gbk,utf-8
因此萬無一失的辦法如下:
Jsp裡的宣告語句可以弄掉四種格式,而剩下的兩種格式可以用監聽器的方法解決:
新建一個監聽器
package com.helloweenvsfei.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{
private String characterEncoding; //���뷽ʽ��������web.xml��
private boolean enabled; //�Ƿ����ø�Filter��������web.xml��
public void destroy() {
// TODO Auto-generated method stub
characterEncoding = null; //���ʱ�����Դ
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
if(enabled || characterEncoding != null){//������ø�Filter
request.setCharacterEncoding(characterEncoding);
//����request����
response.setCharacterEncoding(characterEncoding);
//����response����
}
chain.doFilter(request, response);
//doFilterִ����һ��Filter����Servlet
}
public void init(FilterConfig config) throws ServletException {
// TODO Auto-generated method stub
//��ʼ��ʱ���ز���
characterEncoding = config.getInitParameter("characterEncoding");
//���뷽ʽ
enabled = "true".equalsIgnoreCase(config.getInitParameter("enabled").trim());
}
}
web.xml
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>com.helloweenvsfei.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>characterEncoding</param-name>
<param-value>utf8</param-value>
</init-param>
<init-param>
<param-name>enabled</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>