UTF8编码JSP中的XHTML内容

时间:2009-12-21 18:27:49

标签: jsp xhtml

我正在尝试在JSP页面中显示XHTML内容。编码是UTF8。 jsp页面调用java类中的方法,该方法返回xhtml内容。基本上这就是我在jsp页面中的内容

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd">
<% response.setContentType("application/xhtml+xml"); %>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
</head>
<body>
<% response.setContentType("application/xhtml+xml"); %>
<%=myJavaClass.getXHTML()%>
</body>
</html>

问题是某些字符显示为QuestionMarks(?)。 但是,如果java类(myJavaClass)将相同的内容写入文件,则在打开文件并在文本编辑器中查看时,所有字符都会正确显示。 Tomcat的控制台还显示所有正确字符的xhtml内容,仅在我看到问号的浏览器中。

有人能想出为什么会发生这种情况的原因吗?

1 个答案:

答案 0 :(得分:4)

有很多因素可以发挥作用。在您的特定情况下,您使用旧式 scriptlet 将XML字符串写入响应。 <%= foo %>隐式调用response.getWriter().write(foo)。您还需要通过将以下内容添加到JSP的顶部来设置响应编写器的字符编码:

<%@ page pageEncoding="UTF-8" %>

这会通过隐式调用UTF-8 将响应编码设置为response.setCharacterEncoding("UTF-8"),如果尚未完成,它还会添加相应的响应标头。

您真正需要考虑的所有因素包括:

  1. 请求编码。对于GET请求,需要在appserver的配置中设置。对于POST请求,您需要使用HttpServletRequest#setCharacterEncoding()
  2. 响应编码。这已在这里得到解答。
  3. 数据库编码。在SQL CREATE期间指定编码。
  4. 有关更多背景信息和所有解决方案的详细概述,您可能会发现this article非常有用。

    也就是说,如果您已经在HTML头中设置了<% response.setContentType("application/xhtml+xml"); %>,则行<meta http-equiv="content-type">完全是多余的。摆脱它们,如果可能的话还要删除它们。只需使用EL:

    ${someBean.somePropertyReturningXmlString}