如何让UTF-8在Java webapps中运行?

时间:2008-09-26 11:48:10

标签: java mysql tomcat encoding utf-8

我需要在我的Java webapp(servlets + JSP,没有使用框架)中使用UTF-8来支持äöå等常规芬兰文本和特殊情况下的ЦжФ等西里尔字母。

我的设置如下:

  • 开发环境:Windows XP
  • 制作环境:Debian

使用的数据库:MySQL 5.x

用户主要使用Firefox2,但Opera 9.x,FF3,IE7和谷歌浏览器也用于访问该网站。

如何实现这一目标?

14 个答案:

答案 0 :(得分:539)

答案 1 :(得分:12)

我认为你在自己的答案中总结得很好。

在端到端的UTF-8-ing(?)过程中,您可能还需要确保java本身使用的是UTF-8。使用-Dfile.encoding = utf-8作为JVM的参数(可以在catalina.bat中配置)。

答案 2 :(得分:11)

要添加到kosoant's answer,如果您使用的是Spring,而不是编写自己的Servlet过滤器,则可以使用它们提供的类org.springframework.web.filter.CharacterEncodingFilter,在web.xml中对其进行如下配置:

 <filter>
    <filter-name>encoding-filter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
       <param-name>encoding</param-name>
       <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
       <param-name>forceEncoding</param-name>
       <param-value>FALSE</param-value>
    </init-param>
 </filter>
 <filter-mapping>
    <filter-name>encoding-filter</filter-name>
    <url-pattern>/*</url-pattern>
 </filter-mapping>

答案 3 :(得分:2)

我还希望从here添加此部分解决了我的问题:

runtime.encoding=<encoding>

答案 4 :(得分:1)

当我们想要使用Java访问它们时,这是MySql表中的希腊语编码:

在JBoss连接池(mysql-ds.xml)中使用以下连接设置

<connection-url>jdbc:mysql://192.168.10.123:3308/mydatabase</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>nts</user-name>
<password>xaxaxa!</password>
<connection-property name="useUnicode">true</connection-property>
<connection-property name="characterEncoding">greek</connection-property>

如果您不想将它放在JNDI连接池中,可以将其配置为JDBC-url,如下一行所示:

jdbc:mysql://192.168.10.123:3308/mydatabase?characterEncoding=greek

对我和尼克来说,我们永远不会忘记它,浪费时间......

答案 5 :(得分:1)

很好的答案。只是想添加一个肯定会帮助其他人看到URL上的UTF-8编码的东西。

按照以下步骤在firefox中对网址启用UTF-8编码。

  1. 在地址栏中输入“about:config”。

  2. 使用过滤器输入类型搜索“network.standard-url.encode-query-utf8”属性。

  3. 默认情况下,上述属性为false,将其转为TRUE。
  4. 重新启动浏览器。
  5. 默认情况下,URL上的UTF-8编码适用于IE6 / 7/8和chrome。

答案 6 :(得分:0)

我遇到了类似的问题,但是,在文件的文件名中,我正在使用apache commons进行压缩。 所以,我用这个命令解决了它:

convmv --notest -f cp1252 -t utf8 * -r

对我来说效果很好。希望它对任何人都有帮助;)

答案 7 :(得分:0)

对于我从消息包中显示Unicode字符的情况,我不需要应用“JSP页面编码”部分来在我的jsp页面上显示Unicode。我只需要“CharsetFilter”部分。

答案 8 :(得分:0)

还没有提到的另一点涉及使用Ajax的Java Servlets。我有这样的情况:网页从用户发送utf-8文本发送到JavaScript文件,该文件将其包含在发送给Servlet的URI中。 Servlet查询数据库,捕获结果并将其作为XML返回到格式化的JavaScript文件,并将格式化的响应插入到原始网页中。

在一个Web应用程序中,我遵循了早期的Ajax书中关于在构造URI时包装JavaScript的说明。书中的例子使用了escape()方法,我发现(困难的方法)是错误的。对于utf-8,您必须使用encodeURIComponent()。

这几天似乎很少有人推出自己的Ajax,但我想我也可以添加它。

答案 9 :(得分:0)

关于@kosoant回答中提到的CharsetFilter ....

tomcat Filter(位于web.xmlconf/web.xml中有一个版本。该过滤器名为setCharacterEncodingFilter,默认情况下已注释。你可以取消注释(请记得取消注释filter-mapping

此外,您无需在jsp-config中设置web.xml(我已针对Tomcat 7+进行测试)

答案 10 :(得分:0)

有时您可以通过MySQL Administrator向导解决问题。在

  

启动变量&gt;高级&gt;

并设置Def。 char集:utf8

也许这个配置需要重启MySQL。

答案 11 :(得分:0)

之前的回复并没有解决我的问题。它只在生产中,使用tomcat和apache mod_proxy_ajp。邮政遗体失去了非ascii字符? 问题最终是JVM defaultCharset(默认安装中的US-ASCII:Charset dfset = Charset.defaultCharset();) 所以,解决方案是使用修饰符运行tomcat服务器以UTF-8作为默认字符集运行JVM:

JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8" 

(将此行添加到catalina.sh并重新启动服务tomcat)

也许您还必须更改linux系统变量(编辑〜/ .bashrc和〜/ .profile进行永久性更改,请参阅https://perlgeek.de/en/article/set-up-a-clean-utf8-environment

  

export LC_ALL = en_US.UTF-8
  export LANG = en_US.UTF-8

     

export LANGUAGE = en_US.UTF-8

答案 12 :(得分:0)

在Spring MVC 5 + Tomcat 9 + JSP上遇到了相同的问题。
经过长期的研究,得出了一个优雅的解决方案(不需要,需要过滤器不需要,需要在Tomcat中进行更改 < strong> server.xml (从8.0.0-RC3版本开始)

  1. 在WebMvcConfigurer实现中,为messageSource设置默认编码(用于从消息源文件中以UTF-8编码读取数据。

    view:cache
  2. 在DispatcherServletInitializer实现中,@ Override onStartup方法并在其中设置请求和资源字符编码。

    @Configuration
    @EnableWebMvc
    @ComponentScan("{package.with.components}")
    public class WebApplicationContextConfig implements WebMvcConfigurer {
    
        @Bean
        public MessageSource messageSource() {
            final ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    
            messageSource.setBasenames("messages");
            messageSource.setDefaultEncoding("UTF-8");
    
            return messageSource;
        }
    
        /* other beans and methods */
    
    }
    
  3. 以UTF-8编码保存所有消息源并查看文件。

  4. 在每个*中添加<%@页面contentType =“ text / html; charset = UTF-8”%> <%@页面pageEncoding =“ UTF-8”%> .jsp文件或将jsp-config描述符添加到web.xml

    public class DispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    
        @Override
        public void onStartup(final ServletContext servletContext) throws ServletException {
    
            // https://wiki.apache.org/tomcat/FAQ/CharacterEncoding
            servletContext.setRequestCharacterEncoding("UTF-8");
            servletContext.setResponseCharacterEncoding("UTF-8");
    
            super.onStartup(servletContext);
        }
    
        /* servlet mappings, root and web application configs, other methods */
    
    }
    

答案 13 :(得分:-1)

如果您已在连接池(mysql-ds.xml)中指定,则在Java代码中可以按如下方式打开连接:

DriverManager.registerDriver(new com.mysql.jdbc.Driver());
Connection conn = DriverManager.getConnection(
    "jdbc:mysql://192.168.1.12:3308/mydb?characterEncoding=greek",
    "Myuser", "mypass");
相关问题