UTF8 кодировал контент XHTML в JSP

Я пытаюсь отобразить содержимое XHTML на странице JSP. Кодировка 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

Есть много факторов, которые могут сыграть свою роль. В вашем конкретном случае вы используете старомодные сценарии для записи строки XML в ответ. <%= foo %> неявно вызывает response.getWriter().write(foo). Вам также нужно установить кодировку символов автоответчика, добавив следующее в верхний вашего JSP:

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

Это установит кодировку ответа на UTF-8 путем неявного вызова response.setCharacterEncoding("UTF-8") и, она также добавит соответствующий заголовок ответа, если он еще не выполнен.

Все факторы, которые вы действительно должны учитывать:

  • Запросить кодирование. Для запросов GET это необходимо установить в конфигурации сервера приложений. Для запросов POST вам нужно использовать HttpServletRequest#setCharacterEncoding().
  • Кодирование ответа. На это уже ответили.
  • Кодировка базы данных. Укажите кодировку во время SQL CREATE.

Для получения дополнительной справочной информации и подробного обзора всех решений вы можете найти эту статью.

Тем не менее, строки <% response.setContentType("application/xhtml+xml"); %> совершенно излишни, если вы уже установили <meta http-equiv="content-type"> в HTML-заголовке. Избавьтесь от них и, если возможно, от скриптлетов. Просто используйте EL:

${someBean.somePropertyReturningXmlString}