javascript 中的 Utf-8 文本在由 Glassfish 提供服务时无法正确显示

Utf-8 text in javascript not showing properly when served by Glassfish

我的脚本保存在 uft-8 编码文件中:

test.js

function sayhi(){

    alert('Γειά σου!')

}

在 html 文件(也是 utf-8)中我得到了 :

<html>
  <head>
    <script charset="utf-8"  type="text/javascript" src="../js/mytest.js"></script>
</head>
  <body>
   ...
   <script type="text/javascript">
                alert('Γειά!')
                sayhi();
    <script type="text/javascript">
 </body>
</html>

问题是应该打印 utf-8 字符串的 sayhi 打印了一个不可读的字符串,而不是它上面的警告 (alert('Γειά!')) 打印正确的字符串。

我错过了什么?如何使 sayhi 使用正确的编码。 谢谢。

PS。该页面由 glassfish 应用服务器提供(不确定是否重要)

编辑 1:

同样在我的 glassfish-web.xml 我已经声明

 <parameter-encoding default-charset="UTF-8"/>

我还可以在 glasfish 中做些什么来正确地服务 javascript?

编辑 2:

我没有提到我也在使用 struts2jersey 并且有些东西告诉我 struts 2 是这里的罪魁祸首。我在想这可能是一些过滤器的实现来改变编码或者一个 strust 指令来忽略 javacript 的路径可能会解决这个问题......稍后会尝试上面的方法。

您实际上不需要脚本标记或脚本本身的字符集 - HTML 页面上的字符集就足够了。有关详细信息,请参阅 this answer。您只需要在 HTML 页面和标题中添加:

<meta charset="utf-8 />

它应该可以工作。

问题已通过向我的 web.xml

添加过滤器解决
public class CharsetFilter implements Filter
{
 public static final String DESIRED_ENCODING="UTF-8";
 private String encoding;

 @Override
 public void init(FilterConfig config) throws ServletException
 {
   encoding = config.getInitParameter("appEncoding");
   if( encoding==null ) encoding=DESIRED_ENCODING;
 }

 @Override
 public void doFilter(ServletRequest request, ServletResponse response, FilterChain next)
 throws IOException, ServletException
 {
  //HttpServletRequest rq=(HttpServletRequest)request;  
  //String uri=rq.getRequestURI().toLowerCase();  
  //System.out.println(""+uri);
  //this is used to fix static javascript encoding 
  if (!encoding.equals(response.getCharacterEncoding())){
    response.setCharacterEncoding(encoding);
  }
  if (!encoding.equals(request.getCharacterEncoding())){
    request.setCharacterEncoding(encoding);
  }

  next.doFilter(request, response);
 }

 public void destroy(){}
}

web.xml中:

        <filter>
        <filter-name>CharsetFilter</filter-name>
        <filter-class>utilities.CharsetFilter</filter-class>
        <init-param>
            <param-name>appEncoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        </filter>
        <filter-mapping>
            <filter-name>CharsetFilter</filter-name>
            <url-pattern>/*</url-pattern>
       </filter-mapping>