Я использую следующий код для чтения моего XML-файла, который содержит символы utf-8:
InputStream inputStream = new FileInputStream(dataFile);
Reader reader = new InputStreamReader(inputStream, "UTF-8");
InputSource is = new InputSource(reader);
is.setEncoding("UTF-8");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(is);
doc.getDocumentElement().normalize();
Если я запустил приведенный выше код в консольном Java-приложении, все в порядке. Но если я запустил этот код в сервлете / jsp с tomcat 8, я потерял все символы utf-8. В моем сервлете / jsp я уже сделал:
response.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");
В файле server.xml tomcat 8 я уже установил
<Connector port = "8080" protocol = "HTTP/1.1"
connectionTimeout = "20000"
redirectPort = "8443" URIEncoding = "UTF-8" />
Каковы возможные причины проблем?
@JoopEggen: заголовок не требуется, а если он отсутствует, предполагается UTF-8.
@JoachimSauer моя формулировка была неправильной: я имел в виду, что когда есть заголовок XML, он может содержать (неправильную) кодировку.
Попробуйте позволить синтаксическому анализатору XML выполнять декодирование, а не делать это самостоятельно: т.е. дайте ему InputStream, а не Reader, полученный путем декодирования InputStream. Я не вижу причин, почему это должно иметь значение; это просто что-то попробовать.




Есть несколько дополнительных шагов, которые стоит попробовать:
...
public void doFilter(
ServletRequest request,
ServletResponse response,
FilterChain next) throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
response.setCharacterEncoding("UTF-8");
next.doFilter(request, response);
}
...
также добавьте соответствующие сопоставления фильтров в web.xml:
<filter>
<filter-name>CharsetFilter</filter-name>
<filter-class>my.CharsetFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharsetFilter </filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Фильтр гарантирует, что если браузер не использует UTF-8, ваш фильтр будет преобразовывать все запросы самостоятельно.
В случае использования JSP добавьте следующую строку в самый верх каждой страницы:
<%@page pageEncoding = "UTF-8" contentType = "text/html; charset=UTF-8"%>
или добавьте в web.xml следующие строки:
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<page-encoding>UTF-8</page-encoding>
</jsp-property-group>
</jsp-config>
Также решением может быть добавление этой строки JSTL <fmt:requestEncoding value = "UTF-8" /> в ваш код JSP.
Кстати, не забудьте перезапустить свой экземпляр Tomcat после этих манипуляций.
Надеюсь, поможет.
XML должен содержать
<?xml ... ?>безencoding=...или также с кодировкой = "UTF-8" `. Редактирование XML с проверкой в вашей IDE тоже может что-то показать.