Я пытаюсь прочитать информацию UTF-8 из запроса. Я использовал "request.setCharacterEncoding(" UTF-8 ");", но, похоже, ничего не делает - чтение информации не является UTF-8.
Что я делаю неправильно?
Я пытаюсь прочитать информацию UTF-8 из запроса. Я использовал "request.setCharacterEncoding(" UTF-8 ");", но, похоже, ничего не делает - чтение информации не является UTF-8.
Что я делаю неправильно?
Если вы используете tomcat, вы также должны установить URIEncoding в UTF-8 в своих разъемах:
<Server port="8105" shutdown="SHUTDOWN">
...
<Service name="Catalina">
<Connector port="8180" URIEncoding="UTF-8" />
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps" />
</Engine>
</Service>
</Server>
HttpServletRequest#setCharacterEncoding()
действует только тогда, когда запрос является запросом POST
, а тело запроса не обрабатывается еще.
Итак, если это не работает в вашем случае, это может иметь две причины:
Фактически вы запускаете запрос GET
. То есть параметры запроса отправляются с клиента на сервер в URL-адрес запроса вместо тела запроса. URL-адрес запроса обрабатывается веб-сервером, а не API-интерфейсом Servlet. Итак, чтобы исправить это, вам нужно настроить соответствующий веб-сервер для декодирования URL-адреса запроса (URI) с использованием указанной кодировки символов. В случае, например, Apache Tomcat, вам нужно установить атрибут URIEncoding
элемента <Connector>
в server.xml
до UTF-8
.
Вы правильно используете POST
, но вы уже (косвенно) обработали тело запроса, чтобы было слишком поздно менять кодировку символов. Тело запроса будет полностью обработано только при первом вызове метода getParameterXXX()
. Есть несколько из них. Он не будет повторно обрабатываться при последующих вызовах. При сглаживании тех, кто вызывает этот метод, не забудьте принять во внимание все объявленные Filter
экземпляры в web.xml
. Некоторые из них могут захватывать и сканировать параметры.
Если это все равно ничего не помогает, единственной возможной причиной является то, что консоль дисплея или регистратор или все, что вы используете для печати/определения/отладки полученного параметра запроса, не поддерживает UTF-8. Вы хотите переконфигурировать консоль /logger/etc для использования UTF-8 вместо этого для отображения символов. Если это, например, консоль Eclipse, вы можете установить ее с помощью окнa > Настройки > Общие > Рабочее пространство > Кодирование текстового файла.
этот метод действительно глупо. его не должно быть, и вы не должны его использовать.
для тела в запросе POST, кодирование должно быть явно определено клиентом в заголовке Content-Type. если нет, это плохая просьба. [1]
для URI запроса GET, клиент не может указать кодировку, а сервер должен иметь неявное кодирование, а программисту необходимо установить кодировку, но этот метод не существует в Servlet API!
однако, у вашего контейнера сервлета может быть собственный способ сделать это.
лучший способ - это, вероятно, установить кодировку JVM по умолчанию для UTF-8.
1: http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7.1
Параметр "charset" используется с некоторыми типами носителей для определения набора символов (раздел 3.4) данных. Когда отправителю не предоставляется явный параметр charset, подтипы мультимедиа типа "text" имеют , для которых значение по умолчанию имеет значение "ISO-8859-1" по умолчанию, если оно получено через HTTP. Данные в наборах символов, отличных от "ISO-8859-1" или его подмножеств MUST, будут помечены соответствующим значением кодировки.
Проблема зависит от того, какой сервер приложений используется. Лучшее описание, которое я нашел в этой .
В некоторых серверах приложений request.setCharacterEncoding(...)
не действует, пока вы не установите кодировку приложения с помощью дескриптора. Самыми сложными являются JBoss, Apache Tomcat, Glassfish. Лучше WebLogic, лучше всего Jetty (настройка UTF-8 по умолчанию).
В моем случае я должен создать дескриптор glassfish-web.xml
и поместить там тег parameter-encoding
. В моем случае для GlassFish:
<glassfish-web-app error-url="">
<!-- request.setCharacterEncoding("UTF-8") not functioning without this setting-->
<parameter-encoding default-charset="UTF-8" />
</glassfish-web-app>
Вы делаете это после вызова request.getParameter.
request.setCharacterEncoding( "UTF-8" ) необходимо вызвать до вызова request.getParameter().
Просто чтобы подтвердить, что для параметров POST вы должны вызвать request.setCharacterEncoding(...)
перед тем, как получить параметры.
А для параметров GET это зависит от того, какой веб-контейнер вы используете (используйте Maurice Perry для Tomcat).
Пожалуйста, проверьте эту ссылку для получения дополнительной информации. "Преобразование символов из браузера в базу данных" http://java.sun.com/developer/technicalArticles/Intl/HTTPCharset/
(как для самого первого вопроса..)
если вы читаете параметры из тела, также можно прочитать каждый элемент со своей собственной кодировкой (посмотрите в последней строке):
ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory());
List items = null;
try {
items = upload.parseRequest(request);
} catch (FileUploadException ex) {
logger.warn("Fail during file upload");
return uploads;
}
Iterator itr = items.iterator();
while (itr.hasNext()) {
FileItem item = (FileItem) itr.next();
if (item.isFormField()) {
String name = item.getFieldName();
System.out.println("name: " + name);
String value = item.getString();
System.out.println("get as utf8 - "+item.getString("UTF-8"));
для jboss/wildfly есть запрос функции https://issues.jboss.org/browse/WFLY-2533
Поместите это в WEB-INF/jboss-web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<jboss-web version="8.0" xmlns="http://www.jboss.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.jboss.org/j2ee/schema/jboss-web_8_0.xsd">
<!-- browser tend to not send encoding information, so we have to match the servlet container's
default encoding with our requested form data encoding: -->
<default-encoding>UTF-8</default-encoding>
</jboss-web>