Я пытаюсь прочитать информацию 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>