java设置程序连接的字符集_如何让UTF-8在Java网络应用程序中工作?

回答我自己,因为这个网站的常见问题鼓励它。这对我有用:

大多数字符都没有问题,因为浏览器使用的默认字符集和webapp使用的tomcat/java都是latin 1,即。ISO-8859-1“理解”这些字符。

要使UTF-8在Java+Tomcat+Linux/Windows+MySQL下工作,需要以下条件:

配置Tomcat的server.xml

有必要配置连接器使用UTF-8对url(GET请求)参数进行编码:

maxThreads="150" minSpareThreads="25" maxSpareThreads="75"

enableLookups="false" redirectPort="8443" acceptCount="100"

connectionTimeout="20000" disableUploadTimeout="true"

compression="on"

compressionMinSize="128"

noCompressionUserAgents="gozilla, traviata"

compressableMimeType="text/html,text/xml,text/plain,text/css,text/ javascript,application/x-javascript,application/javascript"

URIEncoding="UTF-8"/>

关键是URI编码=“UTF-8”在上面的例子中。Tomcat以UTF-8编码的方式处理所有传入的GET参数。因此,当用户将以下内容写入浏览器的地址栏时:https://localhost:8443/ID/Users?action=search&name=*ж*

字符ж作为utf-8处理,并被编码为(通常是浏览器在到达服务器之前)。%D0%B6.

POST请求不受此影响。

CharsetFilter

然后,是时候强制java webapp以UTF-8编码的方式处理所有请求和响应了。这要求我们定义一个字符集过滤器,如下所示:package fi.foo.filters;import javax.servlet.*;import java.io.IOException;public class CharsetFilter implements Filter {

private String encoding;

public void init(FilterConfig config) throws ServletException {

encoding = config.getInitParameter("requestEncoding");

if (encoding == null) encoding = "UTF-8";

}

public void doFilter(ServletRequest request, ServletResponse response, FilterChain next)

throws IOException, ServletException {

// Respect the client-specified character encoding

// (see HTTP specification section 3.4.1)

if (null == request.getCharacterEncoding()) {

request.setCharacterEncoding(encoding);

}

// Set the default response content type and encoding

response.setContentType("text/html; charset=UTF-8");

response.setCharacterEncoding("UTF-8");

next.doFilter(request, response);

}

public void destroy() {

}}

此过滤器确保如果浏览器没有设置在请求中使用的编码,则将其设置为UTF-8。

此过滤器所做的另一件事是设置默认响应编码,即。返回html/任何内容的编码。另一种方法是设置响应编码等。在应用程序的每个控制器中。

必须将此筛选器添加到web.xml或者Webapp的部署描述符:

CharsetFilter

fi.foo.filters.CharsetFilter

requestEncoding

UTF-8

CharsetFilter

/*

JSP页面编码

在你的web.xml,增加以下内容:

*.jsp

UTF-8

或者,Web应用程序的所有JSP页面都需要有以下内容:

如果使用了具有不同JSP片段的布局,则需要在全他们。

HTML-元标记

JSP页面编码告诉JVM以正确的编码方式处理JSP页面中的字符。然后,是时候告诉浏览器在哪个浏览器中编码html页面:

这是通过webapp生成的每个xhtml页面顶部的以下内容完成的:<?xml  version="1.0" encoding="UTF-8"?>

html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

...

JDBC连接

当使用db时,必须定义连接使用UTF-8编码.这是在context.xml或者在JDBC连接被破坏的地方,如下所示:

auth="Container"

type="javax.sql.DataSource"

maxActive="20" maxIdle="10" maxWait="10000"

username="foo"

password="bar"

driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/

ID_development?useEncoding=true&characterEncoding=UTF-8"

/>

MySQL数据库和表

使用的数据库必须使用UTF-8编码.这是通过使用以下方法创建数据库来实现的:CREATE DATABASE `ID_development`

/*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_swedish_ci */;

然后,所有的表格也需要放在UTF-8中:CREATE TABLE  `Users` (

`id` int(10) unsigned NOT NULL auto_increment,

`name` varchar(30) collate utf8_swedish_ci default NULL

PRIMARY KEY  (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci ROW_FORMAT=DYNAMIC;

关键是字符集=UTF 8.

MySQL服务器配置

MySQLserveri也必须进行配置。这通常是在Windows中通过修改我的.尼-通过配置我的.cnf-存档。在这些文件中,应该定义连接到服务器的所有客户端都使用UTF 8作为默认字符集,服务器使用的默认字符集也是UTF 8。[client]

port=3306

default-character-set=utf8   [mysql]

default-character-set=utf8

MySQL程序和功能

这些还需要定义字符集。例如:DELIMITER $$

DROP FUNCTION IF EXISTS `pathToNode` $$

CREATE FUNCTION `pathToNode` (ryhma_id INT) RETURNS TEXT CHARACTER SET utf8

READS SQL DATA   BEGIN

DECLARE path VARCHAR(255) CHARACTER SET utf8;

SET path = NULL;

...

RETURN path;

END $$

DELIMITER ;

收到请求:latin 1和UTF-8

如果在tomcat的server.xml中定义的GET请求参数是用UTF-8编码的,则正确处理以下GET请求:https://localhost:8443/ID/Users?action=search&name=Petteri

https://localhost:8443/ID/Users?action=search&name=ж

因为ASCII-字符的编码方式与latin 1和UTF-8相同,所以字符串“Petteri”的处理是正确的。

在latin 1中,完全不理解西里尔字符ж。因为Tomcat被指示以utf-8的形式处理请求参数,所以它正确地将该字符编码为%D0%B6.

如果浏览器被指示以utf-8编码(带有请求头和html元标记)读取页面,那么至少火狐2/3和其他浏览器在此期间都将字符本身编码为%D0%B6.

最终的结果是找到了所有名为“Petteri”的用户,也找到了所有名为“ж”的用户。

但那是怎么回事?

HTTP-规范定义默认情况下URL被编码为latin 1。这导致了火狐2,火狐3等。编码如下https://localhost:8443/ID/Users?action=search&name=*Päivi*

进入编码版本https://localhost:8443/ID/Users?action=search&name=*P%E4ivi*

在后缀中的字符ä编码为%E4. 即使页面/请求/所有内容都定义为使用UTF-8..UTF-8编码版本%C3%A4

这样做的结果是,Webapp完全不可能真正处理来自GET请求的请求参数,因为有些字符是在latin 1中编码的,而其他字符则是在UTF-8中编码的。注意:如果页面被定义为utf-8,则POST请求确实可以作为浏览器来编码所有来自utf-8表单的请求参数。

读物

非常感谢以下作者对我的问题给出了答案:http://tagunov.tripod.com/i18n/i18n.html

http://wiki.apache.org/tomcat/Tomcat/UTF-8

http:/java.sun.com/Developer/TechnicalArticules/Intl/HTTPCharset/

http:/dev.mysql.com/doc/reflman/5.0/en/charset-syntax.html

http:/cagan327.blogpot.com/2006/05/utf-8-编码-补丁-tomcat-jsp-etc.html

http:/cagan327.blogpot.com/2006/05/utf-8-编码-补丁-for-mysql-tomcat.html

http://jeppesn.dk/utf-8.html

http:/www.nabble.com/Request-Parameters-Mishand-utf-8-coding-td18720039.html

http:/www.utoronto.ca/webdocs/HTMLdocs/newHTML/iso_table.html

http://www.utf8-chartable.de/

重要注记

MySQL支持基本多语言平面使用3字节UTF-8字符。如果您需要超出此范围(某些字母表需要超过3字节的utf-8),则需要使用VARBINARY列类型或使用utf8mb4字符集(这需要MySQL 5.5.3或更高版本)。请注意,使用utf8MySQL中的字符集不会100%工作。

带有Apache的Tomcat

如果您使用Apache+Tomcat+mod_jk连接器,还需要进行以下更改:将URIEncode=“UTF-8”添加到tomcat server.xml文件中,用于8009连接器,由mod_jk连接器使用。

转到Apache文件夹,即

/etc/httpd/conf加上

AddDefaultCharset utf-8在……里面

httpd.conf file. 注:首先检查它是否存在。如果存在,您可以用这行更新它。您也可以在底部添加这一行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值