Для определения кодировки данных ответа необходимо использовать метод setCharacterEncoding объекта класса HttpServletResponse. Например, для установки UTF-8:
public class FooServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("UTF-8"); // далее остальной код... } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost (request, response); } }А вот с кодировкой данных, которые будут отправлены в запросе на сервер есть небольшая хитрость. Казалось бы, если страница сформирована, допустим, в кодировке UTF-8, то и данные запроса должны обрабатываться сервером, как UTF-8. Однако, этого не происходит, потому что в запросе браузер не передает информацию о кодировке данных. Если для отправки данных формы используется метод POST, то все просто - можно точно так же вызвать метод setCharacterEncoding, только для объекта класса HttpServletRequest:
request.setCharacterEncoding("UTF-8");Проблема возникнет, если для отправки данных формы будет использоваться метод GET. В таком случае request.setCharacterEncoding("UTF-8") уже не сработает и Tomcat будет обрабатывать строку запроса так, как-будто она в кодировке ISO8859-1.
Для решения этой проблемы необходимо подправить конфигурационный файл Apache Tomcat server.xml и в тег Connector добавить параметр useBodyEncodingForURI="true":
<Connector connectionTimeout="20000" port="8081" protocol="HTTP/1.1" redirectPort="8443" useBodyEncodingForURI="true"/>После этого перезагружаем Tomcat и для метода GET можно будет также использовать request.setCharacterEncoding("UTF-8") для указания кодировки запроса:
public class FooServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("UTF-8"); // кодировка ответа request.setCharacterEncoding("UTF-8"); // кодировка запроса; необходимо указать до // вызова request.getParameter() // далее остальной код... String param1=request.getParameter("param1"); String param2=request.getParameter("param2"); // ... } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost (request, response); } }В том же теге Connector, используя параметр URIEncoding вместо useBodyEncodingForURI, можно явно установить нужную для вас кодировку, например URIEncoding="UTF-8", решайте сами, что для вас удобнее.
спасибо за комплексное решение проблемы))))
ОтветитьУдалитьправда я думаю стоить добавить тот момент, что в проекте по умолчаниях в настройке "Project properties/Resource/Text File encoding" используется кодировка "win-1251" и у меня не работало до тех пор, пока я не изменил этот параметр на UTF8. После этой операции конечно пришлось переписать все слова наново, но зато заработало!!!
еще раз спасибо!!!
Рад что помогло!
ОтветитьУдалитьВаше замечание, на сколько я понимаю, справедливо только если вы работаете под Windows, и если вы в самом коде пишите значения параметров русскими буквами, т.е. когда они берутся не из формы. win-1251 родная кодировка для винды, поэтому и файлы с исходным кодом в эклипсе по умолчанию в этой кодировке. У меня Linux, поэтому я как-то даже и не задумался о такой ситуации.
Если вы программируете для вэб, то всегда и везде используйте UTF-8, и не будет проблем :)
Чувак, спасибо тебе огромное!
ОтветитьУдалитьВсегда пожалуйста! )
ОтветитьУдалитьспасибо, пригодилось...
ОтветитьУдалитьЦелый день бился над проблемой кодировки в своём сервлете. После того как подправил server.xml тоже была неправильная кодировка. Оказалось это мой косяк. Надо было поменять местами строки в doGet():
ОтветитьУдалитьPrintWriter out = response.getWriter();
response.setContentType("text/html;charset=Windows-1251");
Спасибо
Спасибо огромное! Пост очень полезен!
ОтветитьУдалитьНа здоровье! )
УдалитьОтлично.
ОтветитьУдалитьСпасибо большое! Решила проблему!
ОтветитьУдалитьПожалуйста!
УдалитьСпасибо! Статья очень помогла. Проблема решилась только двумя строчками
ОтветитьУдалитьresponse.setContentType("text/html; charset=UTF-8"); и request.setCharacterEncoding("UTF-8");
и даже ничего не пришлось менять/добавлять в файле server.xml.