JAVA涂鸦
关于JAVA的点点滴滴
posts - 50,  comments - 689,  trackbacks - 0
    这段时间经常看到有人问到web开发中怎么中文总是?号。原因其实很简单,因为大家大多用的是tomcat服务器,而tomcat服务器的默认编码为 iso-8859-1(西欧字符)。就是因为iso-8859-1(西欧字符)编码造成了我们经常看到?号。关于iso-8859-1(西欧字符)更多知 识请看《字节,字符和编码这篇文章。

方法一:最简单也是用的最多的方法。
<%@ page language="java" pageEncoding="GBK" %>
或者<%@ page contenttype="text/html;charset=gbk";>这里可以用gb2312或者gbk,只是gbk比gb2312支持跟多的字符。

这个方法用于jsp页面中的中文显示。

方法二:使用过滤器。
过滤器使用主要针对表单提交,插入数据库的数据都是?号。这也是应为tomcat不按request所指定的编码进行编码,还是自作主张的采用默认编码方式iso-8859-1编码。
编写一个SetCharacterEncodingFilter类。
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);
}
chain.doFilter(request, response);
}

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

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

然后再web.xml加上
<!-- Set Character Encoding-->
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>com.struts.common.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Set Character Encoding-->

使用过滤器的好处很多,特别是项目之中。
而且在使用国际化时就更有用了,只要在页面指定<%@ page language="java" pageEncoding="UTF-8" %>,服务器就会根据本地Locale来显示正确的字符集。

所以我特别推荐使用过滤器。

方法三:修改tomcat的server.xml文件中URIEncoding。
<Connector
debug="0"
acceptCount="100"
connectionTimeout="20000"
disableUploadTimeout="true"
port="80"
redirectPort="8443"
enableLookups="false"
minSpareThreads="25"
maxSpareThreads="75"
maxThreads="150"
maxPostSize="0"
URIEncoding="GBK"
>
</Connector>
这个方法主要针对从url中获取字符串的问题。
在tomcat5.0及以上版本,post和get方法在处理编码时有所不同。如果你在url中获取中文就会出现?号。但在tomcat4.1版本没有问题,因为tomcat4.1的post和get方法在处理编码时是一样的。
posted on 2006-03-04 10:20 千山鸟飞绝 阅读(10519) 评论(16)  编辑  收藏 所属分类: Web开发

FeedBack:
# re: 解决web开发中的中文问题。
2006-03-04 10:38 | lucky
我在项目中(数据库设置为UTF-8)需要支持国际化,我们就是按照这种三种方式处理的。使用ExtremeCompontes也有人问过编码问题,本来想这两天整理出来,没想到你先做了。谢谢,对于国际化在数据库中的处理:以Mysql为例,设置为支持utf-8。特别注意:连接数据库的dataurl要如下指定使用utf8编码,要不然保存、显示数据仍然是"?":
connectionURL= "jdbc:mysql://localhost:3306/mysqldb?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;mysqlEncoding=utf8"  回复  更多评论
  
# re: 解决web开发中的中文问题。
2006-03-05 10:34 | rickhunter
十分感谢lucky的补充。
希望大家有什么好的经验都拿出来给大家分享。
  回复  更多评论
  
# re: 解决web开发中的中文问题。
2006-03-23 11:27 | javadolt
@lucky
以Mysql为例,设置为支持utf-8。您好,请问您MySql中数据库的字符集是如何设置的,谢谢您!我的mysql中只有latin1 big5 czech euc_kr gb2312 gbk latin1_de sjis tis620 ujis 字符集,没看见UTF-8 :(  回复  更多评论
  
# re: 解决web开发中的中文问题。
2006-03-23 14:02 | 千山鸟飞绝
我没怎么用过MySQL,但MySQL也支持UTF-8。
这个不需要你去设置的。  回复  更多评论
  
# re: 解决web开发中的中文问题。
2006-03-25 23:25 | rickhunter
to javadolt
你只需要将MySQL设置为gb2312或者GBK就可以了.  回复  更多评论
  
# re: 解决web开发中的中文问题。
2006-03-31 23:42 | FuCheng
我都是用UTF-8,写ResourceBundle,用JSTL的fmt标签,native2ascii转换汉字,一直都挺好的。提交表单的时候都使用UTF-8编码,服务器使用URLDecoder从UTF-8解码出来。  回复  更多评论
  
# re: 解决web开发中的中文问题。
2006-04-26 14:01 | ert
useUnicode=true&amp;characterEncoding=utf-8&amp;mysqlEncoding=utf8
这个没有用的。  回复  更多评论
  
# re: 解决web开发中的中文问题。
2006-06-28 16:59 | xcx
我用window.open下载文件,用window.open('../abc/项目文档.doc');但是提示说/abc/XXX.doc找不到(XXX表示乱码),如何解决呢?
  回复  更多评论
  
# re: 解决web开发中的中文问题。
2006-07-24 19:09 | jsm
我采用你的过滤器,怎么时好时坏呀,有时重启猫后好的,有时重启后就不好  回复  更多评论
  
# re: 解决web开发中的中文问题。
2006-08-11 18:05 | xiaocao
你好!我用的是你的第二种方法,但是数据库和页面上显示均为乱码,不知道怎么回事?
我的环境:struts+hibernate+mysql.
jndi的连接:jdbc:mysql://localhost:3306/db?user=root&amp;password=mysql&amp;autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;mysqlEncoding=utf8
页面上<%@ page language="java" pageEncoding="UTF-8"%>
web.xml有:
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>com.common.strutsbase.SetEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<servlet-name>/*</servlet-name>
</filter-mapping>

能指点一下吗?谢谢!!  回复  更多评论
  
# re: 解决web开发中的中文问题。
2006-08-11 18:15 | xiaocao
不好意思,web.xml
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>com.forsoft.apportion.common.strutsbase.SetEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

我在建表的时候已经设置表的编码为utf-8  回复  更多评论
  
# re: 解决web开发中的中文问题。
2006-10-12 08:39 | yiqun
你好,我发现在提交表单后,在页面上显示的汉字为乱码,通过ISO-8859-1到UTF-8的转换则可以正常显示,这是为什么?上面提到的过滤器不是在所有的请求中都强制使用UTF-8来作为编码的吗?希望您可以指点一下!  回复  更多评论
  
# re: 解决web开发中的中文问题。
2006-10-12 09:47 | yiqun
采用POST方式就可以了!  回复  更多评论
  
# re: 解决web开发中的中文问题。
2007-05-25 21:31 | jackie.Q
十分感谢
我的问题解决了  回复  更多评论
  
# re: 解决web开发中的中文问题。
2007-06-12 10:22 | frightyouth
你好,为什么我用MySQL数据库的时候,数据库中的中文是正常的,但查询到页面显示时就是乱码呢??麻烦您指点一下!!!  回复  更多评论
  
# re: 解决web开发中的中文问题。
2007-06-12 14:22 | 千山鸟飞绝
@frightyouth
jdbc:mysql://localhost/BookDB?useUnicode=true&characterEncoding=GBK  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 
正在阅读:



<2006年3月>
2627281234
567891011
12131415161718
19202122232425
2627282930311
2345678

常用链接

留言簿(35)

随笔档案

文章分类

文章档案

好友的blog

我的其他blog

老婆的Blog

搜索

  •  

积分与排名

  • 积分 - 773028
  • 排名 - 56

最新评论

阅读排行榜

评论排行榜