環(huán)境:
JDK1.5
TOMCAT5.0.30
%TOMCAT_HOME%:F:\Tomcat 5.0
統(tǒng)一使用utf-8
一。URL:
修改%TOMCAT_HOME%\conf\server.xml文件
找到如下內(nèi)容:
<Connector
port="80" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true" />
添加:URIEncoding="utf-8"
修改后內(nèi)容如下:
<Connector
port="80" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true" URIEncoding="utf-8" />
在客戶段需要對(duì)URL中的中文進(jìn)行編碼
eg:
String t=URLEncoder.encode("help中文", "utf8");
urlString="http://61.144.47.228/sendSeveninfo.do?msisdn=8615602387092&content="+t+"&username=seven&password=seven777";
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
String coo = conn.getResponseMessage();
在服務(wù)器端用URLDecoder解碼
String de=URLDecoder.decode(request.getParameter("content"), "utf8");
String content = new String(request.getParameter("content").getBytes(),"utf8");
百度URL用GBK編碼, displaytag 和google用的是utf8編碼.
二。處理表單亂碼:
用過濾器吧。
下面是用于處理表單的一個(gè)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 自動(dòng)生成方法存根
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 自動(dòng)生成方法存根
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"%>
關(guān)鍵:charset=gb2312
servlet中:
在doGet 或doPost方法中加入如下代碼:
response.setCharacterEncoding("utf-8");
四。處理文件下載時(shí)提示保存文件名亂碼的解決方法
在處理下載的JSP或servlet里修改響應(yīng)頭部如下:
response.setContentType("application/octet-stream;charset=utf8");
將文件名進(jìn)行編碼轉(zhuǎn)換:
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文件時(shí)出現(xiàn)亂碼
如果properties文件里含有中文時(shí)不可以用ResourceBundle度取,需先對(duì)properties文件進(jìn)行編碼轉(zhuǎn)換
在JDK中提供了native2ascii命令 他能夠?qū)崿F(xiàn)字符編碼的轉(zhuǎn)換。
假設(shè)message.properties 文件在目錄WEB-INF/resource目錄下
在命令行模式下進(jìn)入WEB-INF/resource目錄,然后執(zhí)行如下命令
native2ascii –encoding utf-8 message.properties message_zh_CN.properties
參數(shù)-encoding表示要轉(zhuǎn)換成的編碼格式
執(zhí)行以上命令以后將生成message_zh_CN.properties文件 現(xiàn)在就可以用ResourceBundle類進(jìn)行讀取了
也可以通過制定讀取文件的編碼格式來讀取文件
isReader = new InputStreamReader(is,GlobalConst.STR_ENCODE_GBK);
bufferedReader = new BufferedReader(isReader);
while ((strLine = bufferedReader.readLine()) != null) {
..........
}
六。AJAX亂碼
在向服務(wù)器傳參前用函數(shù)encodeURIComponent(String str)對(duì)參數(shù)進(jìn)行編碼
七。數(shù)據(jù)庫編碼
拿MySQL舉例
在建表和建庫時(shí)限定編碼格式:
eg: CREATE database <庫> CHARACTER SET UTF8
create table <表>(
.........
)engine=InnoDB character set utf8;
文章出處:http://www.diybl.com/course/3_program/java/javaxl/200861/118552_2.html