中文亂碼問題解決方案

  

環境:
JDK1.5
TOMCAT5.0.30
%TOMCAT_HOME%:F:/Tomcat 5.0
統一使用utf-8
一。URL:
修改%TOMCAT_HOME%/conf/server.xml文件
找到如下內容:
    <Connector 
port="80"               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               debug="0" connectionTimeout="20000" 
               disableUploadTimeout="true" />
添加:URIEncoding="utf-8"
修改後內容如下:
    <Connector 
port="80"               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               debug="0" connectionTimeout="20000" 
               disableUploadTimeout="true" URIEncoding="utf-8" />

二。處理表單亂碼:
用過濾器吧。
下面是用於處理表單的一個filter

package hrl.util.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 SetCharacterEncodingFilter implements Filter {
    protected String encoding = null;
    protected FilterConfig filterConfig = null;
    protected boolean ignore = true;

    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig=filterConfig;
        this.encoding=filterConfig.getInitParameter("encoding");
        String value=filterConfig.getInitParameter("ignore");
        if(value==null)
        this.ignore=true;
        else if(value.equalsIgnoreCase("true"))
            this.ignore=true;
        else
            this.ignore=false;
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // TODO 自動生成方法存根
        if (ignore || (request.getCharacterEncoding() == null)) {
            String encoding = selectEncoding(request);
            if (encoding != null){
                request.setCharacterEncoding(encoding);
            }else
                System.out.println("encoding has not set");
        }
        chain.doFilter(request, response);
    }

    public void destroy() {
        // TODO 自動生成方法存根
        this.encoding = null;
        this.filterConfig = null;
    }

    protected String selectEncoding(ServletRequest request) {
        return (this.encoding);
    }
}

在web.xml裏配置此filter,將其影射到所有頁面上
    <filter>
        <filter-name>encoding filter</filter-name>
        <filter-class>hrl.util.filter.SetCharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    
    <filter-mapping>
        <filter-name>encoding filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

三。處理jsp&servlet頁面顯示亂碼
JSP中:
最頂端加入如下代碼:
<%@ page language="java" contentType="text/html;charset=utf-8"%>
關鍵:charset=gb2312
servlet中:
在doGet 或doPost方法中加入如下代碼:
response.setCharacterEncoding("utf-8");

四。處理文件下載時提示保存文件名亂碼的解決方法
在處理下載的JSP或servlet裏修改響應頭部如下:
response.setContentType("application/octet-stream;charset=utf8");
將文件名進行編碼轉換:
response.addHeader("Content-Disposition","attachment;filename="+hrl.util.text.DealString.toUtf8String(file.getName())+"/"");
DealString類的toUtf8String方法如下:
    public static String toUtf8String(String src)
    {
        byte[] b = src.getBytes();
        char[] c = new char[b.length];
        for(int i=0;i<b.length;i++)
        {
            c[i] = (char)(b[i]&0x00FF);
        }
        return new String(c);
    }
五。讀取properties文件時出現亂碼
如果properties文件裏含有中文時不可以用ResourceBundle度取,需先對properties文件進行編碼轉換
在JDK中提供了native2ascii命令 他能夠實現字符編碼的轉換。
假設message.properties 文件在目錄WEB-INF/resource目錄下
在命令行模式下進入WEB-INF/resource目錄,然後執行如下命令
native2ascii –encoding utf-8 message.properties message_zh_CN.properties
參數-encoding表示要轉換成的編碼格式
執行以上命令以後將生成message_zh_CN.properties文件 現在就可以用ResourceBundle類進行讀取了
六。AJAX亂碼
在向服務器傳參前用函數encodeURIComponent(String str)對參數進行編碼
七。數據庫編碼
拿MySQL舉例
在建表和建庫時限定編碼格式:
eg: CREATE database <庫> CHARACTER SET UTF8
create table <表>(
       .........
)engine=InnoDB character set utf8;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章