Кодирование вывода JSP

#jsp #character-encoding

#jsp #кодировка символов

Вопрос:

Когда я пишу следующее

 é
  

или даже

 <%=new String(new byte[]{(byte) 0xC3, (byte) 0xA9}, "UTF-8")%>
  

Я получаю строку длиной 1. Она содержит один символ UTF-8 C3A9 или é .

Но когда она записывается в браузер, браузер не может ее декодировать, если я не использую latin1. Таким образом, это означает, что он кодируется и записывается как western, хотя в верхней части JSP у меня есть

 <%@page import="..." contentType="text/html" pageEncoding="UTF-8" session="false"%>
  

Как я могу заставить JSP выводить UTF-8 вместо записи заголовка UTF-8 и последующего кодирования с помощью latin1? «Western (ISO-8859-1)»

Комментарии:

1. Вау, что плохого в том, чтобы просто написать é или, может быть, на самом высоком <%="é"%> уровне в шаблоне?

2. @BalusC: Я хотел гарантировать, что проблем с кодировкой редактора не было. Отредактировано.

3. Ах, вы используете MSIE в качестве браузера?

4. @BalusC: Нет. Firefox и Chrome.

Ответ №1:

Вы должны использовать только pageEncoding и записывать сам символ, а не ссылаться на него с помощью его кода.

Также убедитесь, что ваш .jsp файл также закодирован в UTF-8. Ваша среда IDE должна обрабатывать pageEncoding атрибут и устанавливать кодировку соответствующим образом, но с определенными настройками или если не используется IDE, .jsp все равно можно закодировать в ISO-8859-1 . Измените это на UTF-8

Наконец, убедитесь, что ваш ответ действительно использует UTF-8 as encoding (используйте firebug, например). Если нет, попробуйте установить ее response.setCharacterEncoding(..)

Комментарии:

1. Заменил <%=...%> предложение одним символом é . Я использую NetBeans IDE и проверил с помощью шестнадцатеричного редактора, что он правильно закодирован в UTF-8 и показывает два байта C3A9 слева и символ é справа. Все еще это не работает. Я даже проверил сгенерированный …_jsp.java файл. Он корректно отображает тот же символ и ту же кодировку. Таким образом, проблема может быть только либо во время компиляции .java в .class, либо в кодировке во время выполнения.

2. @George Bailey ну, у меня это работает. Попробуйте мое последнее предложение. Если это не сработает, значит, в вашем случае есть что-то еще, чего я не вижу.

3. Таким образом, вы уже записывали ответ перед вызовом @page pageEncoding ? В противном случае этого не должно произойти, и это на самом деле также не является правильным решением для в JSP. @page Должна быть самой первой строкой в JSP, и сервлет предварительной обработки — если таковой имеется — не должен был записывать ни одного символа в тело ответа.

4. @BalusC: Я думаю, проблема заключалась в том, что я использовал include вместо forward для вызова JSP. Я не использовал forward , потому что это изменяет URL на путь к JSP, который никогда не является тем, что мне нужно.

5. <%@page pageEncoding="UTF-8"%> должна быть установлена во ВСЕХ JSP, следовательно, также в родительском JSP, а не только в дочернем JSP.