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:
我没有提到我也在使用 struts2
和 jersey
并且有些东西告诉我 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>
我的脚本保存在 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:
我没有提到我也在使用 struts2
和 jersey
并且有些东西告诉我 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>