Ошибка XML XPath utf-8 с сервлетом Java?

Я использую следующий код для чтения моего 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" />

Каковы возможные причины проблем?

XML должен содержать <?xml ... ?> без encoding=... или также с кодировкой = "UTF-8" `. Редактирование XML с проверкой в ​​вашей IDE тоже может что-то показать.

Joop Eggen 15.06.2018 09:16

@JoopEggen: заголовок не требуется, а если он отсутствует, предполагается UTF-8.

Joachim Sauer 15.06.2018 09:32

@JoachimSauer моя формулировка была неправильной: я имел в виду, что когда есть заголовок XML, он может содержать (неправильную) кодировку.

Joop Eggen 15.06.2018 09:58

Попробуйте позволить синтаксическому анализатору XML выполнять декодирование, а не делать это самостоятельно: т.е. дайте ему InputStream, а не Reader, полученный путем декодирования InputStream. Я не вижу причин, почему это должно иметь значение; это просто что-то попробовать.

Michael Kay 15.06.2018 13:28
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
58
1

Ответы 1

Есть несколько дополнительных шагов, которые стоит попробовать:

  1. Попробуйте определить класс фильтра кодировки:

...

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, ваш фильтр будет преобразовывать все запросы самостоятельно.

  1. В случае использования 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 после этих манипуляций.

Надеюсь, поможет.

Другие вопросы по теме