栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何使UTF-8在Java Webapps中工作?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何使UTF-8在Java Webapps中工作?

通常,字符äåö没问题,因为浏览器和Web应用程序的tomcat / java使用的默认字符集为latin1即。“理解”这些字符的ISO-8859-1。

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

配置Tomcat的server.xml

必须配置连接器使用UTF-8编码url(GET请求)参数:

<Connector port="8080" maxHttpHeaderSize="8192" 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"/>

在上面的示例中,关键部分是URIEncoding =“ UTF-8”。这可以防止Tomcat将所有传入的GET参数处理为UTF-8编码。结果,当用户将以下内容写入浏览器的地址栏时:

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

字符ж被当作UTF-8处理,并且被编码为%D0%B6(通常在到达服务器之前由浏览器访问)。

POST请求不受此影响。

CharsetFilter

然后是时候强制Java Web应用程序以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 start-->   <filter>    <filter-name>CharsetFilter</filter-name>    <filter-class>fi.foo.filters.CharsetFilter</filter-class>      <init-param>        <param-name>requestEncoding</param-name>        <param-value>UTF-8</param-value>      </init-param>  </filter>  <filter-mapping>    <filter-name>CharsetFilter</filter-name>    <url-pattern>;

然后,所有表也都必须使用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;

关键部分是CHARSET = utf8。

MySQL服务器配置

还必须配置MySQL serveri。通常,这是在Windows中通过修改my.ini -file和在Linux中通过配置my.cnf -file来完成的。在这些文件中,应该定义所有连接到服务器的客户端都使用utf8作为默认字符集,并且服务器使用的默认字符集也是utf8。

   [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 ;

GET请求:latin1和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=ж

由于latin1和UTF-8均以相同的方式编码ASCII字符,因此正确处理了字符串“ Petteri”。

拉丁语中完全不了解西里尔字母ж。由于指示Tomcat将请求参数处理为UTF-8,因此它将该字符正确编码为%D0%B6。

如果并且当指示浏览器读取UTF-8编码的页面(带有请求标头和html meta-tag)时,至少Firefox 2/3和此期间的其他浏览器都将字符本身编码为%D0%B6。

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

But what about äåö?

HTTP规范定义默认情况下,URL编码为latin1。这导致firefox2,firefox3等对以下内容进行编码

    https://localhost:8443/ID/Users?action=search&name=*Päivi*

进入编码版本

https://localhost:8443/ID/Users?action=search&name=*P%E4ivi*

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

结果是,由于某些字符在latin1中编码,而另一些字符在UTF-8中编码,因此webapp完全不可能正确地处理GET请求中的请求参数。 注意:如果页面被定义为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/technicalArticles/Intl/HTTPCharset/
  • http://dev.mysql.com/doc/refman/5.0/en/charset-syntax.html
  • http://cagan327.blogspot.com/2006/05/utf-8-encoding-fix-tomcat-jsp-etc.html
  • http://cagan327.blogspot.com/2006/05/utf-8-encoding-fix-for-mysql-tomcat.html
  • http://jeppesn.dk/utf-8.html
  • http://www.nabble.com/request-parameters-mishandle-utf-8-encoding-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%地工作。

Tomcat与Apache

还有一件事,如果你使用的是Apache + Tomcat + mod_JK连接器,则还需要进行以下更改:

  1. 将URIEncoding =“ UTF-8”添加到8009连接器的tomcat server.xml文件中,由mod_JK连接器使用。
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8"/>
  2. 转到你的apache文件夹即
    /etc/httpd/conf
    添加
    AddDefaultCharset utf-8
    httpd.conf file
    。注意:首先检查它是否存在。如果存在,你可以使用此行对其进行更新。你也可以在底部添加此行。
    分享改善这个答案


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/398561.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号