【问题标题】:Unable to change charset from ISO-8859-1 to UTF-8 in glassfish 3.1无法在 glassfish 3.1 中将字符集从 ISO-8859-1 更改为 UTF-8
【发布时间】:2011-09-10 21:24:38
【问题描述】:

我在将 Web 应用程序响应中的字符集从 ISO-8859-1(默认)更改为 UTF-8 时遇到问题。我已经在 J​​VM 选项中添加了 VM 选项 -Dfile.encoding=UTF-8

但是,作为 glassfish 的响应,我确实收到了以下 HTTP 标头:

Content-Type: [...;charset=ISO-8859-1]
Server: [GlassFish Server Open Source Edition 3.1]

非常感谢您的帮助/想法。

【问题讨论】:

    标签: java servlets utf-8 character-encoding glassfish


    【解决方案1】:

    -Dfile.encoding 是关于如何读取 Java 源文件的 Oracle JVM 特定设置。这对 HTTP 响应的 Content-Type 标头中指定的字符集没有任何影响。

    您需要将以下内容添加到您的web.xml,以便将所有 JSP 的响应以 UTF-8 格式发送并让它在响应标头中设置适当的字符集。

    <jsp-config>
        <jsp-property-group>
            <url-pattern>*.jsp</url-pattern>
            <page-encoding>UTF-8</page-encoding>
        </jsp-property-group>
    </jsp-config>
    

    另见:

    【讨论】:

    • 该行应该足以在标头中获取它(请注意,当通过 HTTP 提供资源时,元标记被 忽略,它是 HTTP 响应标头重要的)。您的问题是由其他原因引起的。回顾一下,您是否真的使用不同的编码返回 Content-Type 标头?通过 Firebug 和 on 检查它。另请参阅此答案中的屏幕stackoverflow.com/questions/4245386/… 如果确实丢失了,您确定在响应已提交很长时间时没有设置它吗?
    • 该死,如果我能彻底阅读规范......(来自 ServletResponse.setCharacterEncoding() :......如果在调用 getWriter 之后调用此方法......) .我们将 contentType 设置为没有字符集的“text-html”,然后调用 getWriter,然后我尝试用 UTF-8 覆盖字符集。但这会被忽略,并使用默认的 ISO-8859-1。所以我需要了解,如何将字符集设置为默认为 UTF-8 或更改代码。
    【解决方案2】:

    对于 Glassfish3 上的 UTF-8 字体(日志文件等):

    转到Server-config > JVM Settings > JVM Options > Add option (@ 987654325@)

    如果您不在-server mode,请转到default-config > JVM Settings > JVM Options

    【讨论】:

      【解决方案3】:

      要为 GlassFish(或 Tomcat 或任何其他 Servlet 容器)定义除默认 ISO-8859-1 以外的标准响应字符集,您需要放置一个调用 response.setCharacterEncoding 的过滤器。方法如下:
      1. 在你的 web.xml 中定义过滤器:

      <filter>
        <filter-name>Set Response Character Encoding</filter-name>
        <filter-class>com.omrispector.util.SetCharacterEncodingFilter</filter-class>
        <init-param>
          <param-name>encoding</param-name>
          <param-value>UTF-8</param-value>
        </init-param>
      </filter>
      
      <filter-mapping>
        <filter-name>Set Response Character Encoding</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
      

      2。这是过滤器的实现:

      package com.omrispector.util;
      
      import javax.servlet.*;
      import java.io.IOException;
      import java.nio.charset.Charset;
      import java.util.logging.Logger;
      
      /**
       * Created by Omri at 03/12/13 10:39
       * Sets the character encoding to be used for all sources returned
       * (Unless they override it later)
       * This is free for use - no license whatsoever.
       */
      public class SetCharacterEncodingFilter implements Filter {
      
        private String encoding = null;
        private boolean active = false;
      
        private static final Logger logger =
            Logger.getLogger(SetCharacterEncodingFilter.class.getName());
      
        /**
         * Take this filter out of service.
         */
        @Override
        public void destroy() {
          this.encoding = null;
        }
      
        /**
         * Select and set (if specified) the character encoding to be used to
         * interpret request parameters for this request.
         */
        @Override
        public void doFilter(ServletRequest request, ServletResponse response,
                             FilterChain chain)
            throws IOException, ServletException {
          if (active) response.setCharacterEncoding(encoding);
          chain.doFilter(request, response);
        }
      
        /**
         * Place this filter into service.
         */
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
          this.encoding = filterConfig.getInitParameter("encoding");
          try {
            Charset testCS = Charset.forName(this.encoding);
            this.active = true;
          } catch (Exception e) {
            this.active = false;
            logger.warning(encoding + " character set not supported ("+e.getMessage()+"). SetCharacterEncodingFilter de-activated.");
          }
        }
      }
      

      【讨论】:

      • 您的解决方案在 Windows 7 环境中的 Glassfish 3.1 中为我工作。我在将静态内容从 Glassfish 传输到浏览器时遇到了同样的问题。甚至元标记也是使用 UTF-8 编码定义的,服务器之前将其作为 ISO-8859-1 交付。感谢您的文章,现在它完美运行。
      【解决方案4】:

      尝试添加:

          <filter> 
                  <filter-name>Set Character Encoding</filter-name> 
                  <filter-class>filters.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>
      

      到您的 web.xml... 根据http://wiki.metawerx.net/wiki/Web.xml,这些节会将您的编码设置为 UTF_8。

      【讨论】:

      • filters.SerCharacterEncodingFilter 处理 request 编码,而不是响应。它也是一个 Tomcat 类,在 GlassFish 中不可用。有关相关的可比较解决方案,请参阅下面的答案。
      猜你喜欢
      • 1970-01-01
      • 2013-01-03
      • 2010-12-08
      • 2011-07-26
      • 1970-01-01
      • 2014-08-29
      • 2014-07-04
      • 1970-01-01
      相关资源
      最近更新 更多