我正在尝试在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内容,仅在我看到问号的浏览器中。
有人能想出为什么会发生这种情况的原因吗?
答案 0 :(得分:4)
有很多因素可以发挥作用。在您的特定情况下,您使用旧式 scriptlet 将XML字符串写入响应。 <%= foo %>
隐式调用response.getWriter().write(foo)
。您还需要通过将以下内容添加到JSP的顶部来设置响应编写器的字符编码:
<%@ page pageEncoding="UTF-8" %>
这会通过隐式调用UTF-8
和将响应编码设置为response.setCharacterEncoding("UTF-8")
,如果尚未完成,它还会添加相应的响应标头。
您真正需要考虑的所有因素包括:
HttpServletRequest#setCharacterEncoding()
。CREATE
期间指定编码。有关更多背景信息和所有解决方案的详细概述,您可能会发现this article非常有用。
也就是说,如果您已经在HTML头中设置了<% response.setContentType("application/xhtml+xml"); %>
,则行<meta http-equiv="content-type">
完全是多余的。摆脱它们,如果可能的话还要删除它们。只需使用EL:
${someBean.somePropertyReturningXmlString}