Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Почему post передаёт в кодировке iso-8859-1? / 25 сообщений из 27, страница 1 из 2
09.06.2017, 14:53
    #39469534
azsx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему post передаёт в кодировке iso-8859-1?
Методом post я передаю значение на этот же сервелет и отображаю его. Не смотря на то, что я:
добавил в server.xml значение: useBodyEncodingForURI="true" и перезапустил томкат;
а также написал utf8 где только можно;
а также в отладчике firefox я вижу нормальную строку для передачи в utf8.
Сам java всё равно получает строку как iso-8859-1. Из-за этого мне приходится конвертировать кодировку строки.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
   @Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        String username = (String) request.getParameter("username");

        // Не понимаю!!! ***********************************************************************
        String righusername = new String(username.getBytes("iso-8859-1"),"utf-8");
        // *******************************************************************************************

        righusername = righusername.toUpperCase();
        response.getWriter().println("<!DOCTYPE html><html><head><meta charset=\"utf-8\"><title>Servlet bot</title></head><body><h1>to</h1><BR>");

        response.getWriter().println("<p>Ваше имя: " + righusername + "</p>");
        response.getWriter().println("<form action=\"bot\" method=\"POST\">");
        response.getWriter().println("<p>Введите имя пользователя: <input type=\"text\" name=\"username\"></p>");
        response.getWriter().println("<input type=\"submit\" value=\"Отправить\" />");
response.getWriter().println("</form>");
        response.getWriter().println("</body></html>");

        // processRequest(request, response);
}



Как заставить post принимать utf8 кодировку?
...
Рейтинг: 0 / 0
09.06.2017, 14:59
    #39469544
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему post передаёт в кодировке iso-8859-1?
azsxа также в отладчике firefox я вижу нормальную строку для передачи в utf8.
А в заголовках запроса что едет?
...
Рейтинг: 0 / 0
09.06.2017, 15:00
    #39469547
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему post передаёт в кодировке iso-8859-1?
...
Рейтинг: 0 / 0
09.06.2017, 15:02
    #39469551
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему post передаёт в кодировке iso-8859-1?
azsxа также написал utf8 где только можно;

Читателям предлагается угадать, "где только можно", "можно ли там где нельзя", "есть ли разница между utf8 и UTF-8", а так же ответы на массу других вопросов.

azsxКак заставить post принимать utf8 кодировку?
Где-то таки UTF-8 не указан.
...
Рейтинг: 0 / 0
09.06.2017, 15:07
    #39469557
lleming
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему post передаёт в кодировке iso-8859-1?
для начала на страничке с которой уходит форма нужно указать что она в UTF-8

<meta charset="utf-8" />

иначе браузер воспримет ее кодировку по своему разумению.
Ежели Ваш браузер отправляте в ISO-LATIN значит
автора также в отладчике firefox я вижу нормальную строку для передачи в utf8.
вероятно сие есть неверное утверждения (т.е имеет место быть недопонимание между нами)
...
Рейтинг: 0 / 0
09.06.2017, 15:12
    #39469563
lleming
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему post передаёт в кодировке iso-8859-1?
дока к томкату говорит что
авторuseBodyEncodingForURI - his specifies if the encoding specified in contentType should be used for URI query parameters, instead of using the URIEncoding , This setting is present for compatibility with Tomcat 4.1.x

т.е. этот параметр указывает что кодировка указанная в Content-Type заголовке должна быть использована для параметров в URI вместо кодировки указанной в URIEncoding и вообще это для совместимости с Tomcat 4.1

Открываем консоль браузера смотрим что за Content-Type в запросе.
...
Рейтинг: 0 / 0
09.06.2017, 15:23
    #39469575
azsx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему post передаёт в кодировке iso-8859-1?
Читаю, запутываюсь ещё больше. Вот мой post из консоли:
авторHost: localhost:8080
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:53.0) Gecko/20100101 Firefox/53.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 45
Referer: http://localhost:8080/Testing/bot
Cookie: JSESSIONID=B07FAB87E0FB5DCA8DC5584F6FB13242
Connection: keep-alive
Upgrade-Insecure-Requests: 1

данные
username=%D1%81%D0%B5%D1%80%D1%91%D0%B3%D0%B0
Но почему нет кодировки? Я её где-то не указал, но где?
---
Мне дали ссылку, там написано, что надо, чтобы указание локали было первым. Но оно ведь первое?
Код: java
1.
2.
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");


---
Как работать с jsp файлами я ещё не разобрался, то есть bot -- это сервелёт. Поэтому строку <%@page pageEncoding="UTF-8" %> мне не куда добавлять
---
<meta charset="utf-8" /> добавил слеш, опечатка.
---
В Content-Type у меня utf-8. А вотв post почему то кодировка не указана. Может правда для совместимости какая то настройка в томкат? Может так и надо и все конвертируют?
...
Рейтинг: 0 / 0
09.06.2017, 16:01
    #39469609
lleming
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему post передаёт в кодировке iso-8859-1?
Content-Type: application/x-www-form-urlencoded
это по дефолту если не указан enctype для формы
azsxНо почему нет кодировки? Я её где-то не указал, но где?

Тут, ниже, вам правду сказали
Мне дали ссылку, там написано, что надо, чтобы указание локали было первым. Но оно ведь первое?
Код: java
1.
2.
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");


это обработка запроса post а не сама форма html страничка, а так все верно.

у вас bot сервлет что мешает вставить <meta charset="utf8"> в OutputStream и проставить Content-Type перед отдачей странички
Код: java
1.
2.
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");




Может правда для совместимости какая то настройка в томкат? Может так и надо и все конвертируют?

вообще ставят URIEncoding в UTF-8
я обычно еще
ставлю URIEncoding в UTF-8, все html странички <meta charset="utf8", IDE в UTF8 настроить, jvm запускать с UTF8
...
Рейтинг: 0 / 0
09.06.2017, 16:07
    #39469614
lleming
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему post передаёт в кодировке iso-8859-1?
хаха doGet не выделился жирным
...
Рейтинг: 0 / 0
09.06.2017, 16:25
    #39469638
azsx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему post передаёт в кодировке iso-8859-1?
У меня в server.xml я сам добавил другой параметр, так как думал он мне поможет. Убрал его, выключил и включил томкат, на всякий случай скомпилировал приложение и положил егов каталог томката (а не просто запустил в netbeans). Смена параметра не помогла.
Код: html
1.
2.
3.
4.
5.
6.
    <Connector port="8080" protocol="HTTP/1.1"

               connectionTimeout="20000"

               redirectPort="8443" URIEncoding="UTF-8" />
    <!-- useBodyEncodingForURI="true" -->


Код doGet у меня по сути пустой:
Код: java
1.
2.
3.
4.
5.
6.
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        processRequest(request, response);
    }


Также в начале сервелета у меня также есть указание кодировки
Код: java
1.
2.
3.
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");


Ну я уже писал. Везде utf-8 поставил, где сумел. Почему она в post не передаётся?
...
Рейтинг: 0 / 0
09.06.2017, 17:15
    #39469684
lleming
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему post передаёт в кодировке iso-8859-1?
что-то вы не договариваете

все еще не видно как вы страничку формируете
...
Рейтинг: 0 / 0
09.06.2017, 17:17
    #39469686
lleming
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему post передаёт в кодировке iso-8859-1?
если принципиально то tag form имеет атрибут accept-charset где можно указать кодировку того что в форме

Код: plaintext
<form method="POST" accept-charset="utf-8">....
...
Рейтинг: 0 / 0
09.06.2017, 17:27
    #39469704
azsx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему post передаёт в кодировке iso-8859-1?
Весь код моего сервелёта bot. Сперва открывается index.html (utf-8) указал его в web.xml. Затем по ссылке перехожу на страницу bot (utf-8) затем пытаюсь вводить по русски и отправляьб запрос.
На сегодня сдаюсь, потом подумаю.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
package test;

import com.sun.java.swing.plaf.windows.resources.windows;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name = "bot", urlPatterns = {"/bot"})
public class bot extends HttpServlet {
    

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        try (PrintWriter out = response.getWriter()) {
            /* TODO output your page here. You may use following sample code. */
            out.println("<!DOCTYPE html>");
            out.println("<html>");
            out.println("<head>");
            out.println("<meta charset=\"utf-8\" />");
            out.println("<title>Servlet bot</title>");            
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>main</h1>"); 
            

            out.println("<form action=\"bot\" method=\"POST\">");
    out.println("<p>Введите имя пользователя: <input type=\"text\" name=\"username\"></p>");
    out.println("<input type=\"submit\" value=\"Отправить\" />");
out.println("</form>");
            
            out.println("</body>");
            out.println("</html>");
            

        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        processRequest(request, response);
    }


    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        //response.getWriter().println("<%@page pageEncoding=\"UTF-8\" %>");
                     String username = (String) request.getParameter("username");
                     //String righusername = new String(username.getBytes("iso-8859-1"),"utf-8");
                     String righusername = username;
                     righusername = righusername.toUpperCase();
    
            response.getWriter().println("<!DOCTYPE html><html><head><meta charset=\"utf-8\" /><title>Servlet bot</title></head><body><h1>to</h1><BR>");
charset=\"utf-8\">");
    
    response.getWriter().println("<p>Ваше имя: " + righusername + "</p>");
    
                response.getWriter().println("<form action=\"bot\" method=\"POST\">");
    response.getWriter().println("<p>Введите имя пользователя: <input type=\"text\" name=\"username\"></p>");
    response.getWriter().println("<input type=\"submit\" value=\"Отправить\" />");
response.getWriter().println("</form>");
            
            response.getWriter().println("</body></html>");

       // processRequest(request, response);
    }

    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}
...
Рейтинг: 0 / 0
09.06.2017, 19:16
    #39469766
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему post передаёт в кодировке iso-8859-1?
Код: java
1.
2.
            response.setCharacterEncoding("UTF-8");
            request.setCharacterEncoding("UTF-8");
...
Рейтинг: 0 / 0
09.06.2017, 19:16
    #39469767
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему post передаёт в кодировке iso-8859-1?
Ну или в конфигах настрой
...
Рейтинг: 0 / 0
09.06.2017, 19:22
    #39469771
lleming
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему post передаёт в кодировке iso-8859-1?
странно, баг воспроизводится в Firefox
согласно w3c приоритет следующий
Код: plaintext
1.
2.
   accept-charset 
   потом charset документа 
   потом по умолчанию UTF-8

accept-charset отсуствует в этой форме. У документа charset utf-8, т.к
Код: plaintext
<meta charset="utf-8">
согласно MDN обозначает кодировку документа причем еще даже указано что разрешено в документе использовать эту кодировку.
т.е. даже Content-Type тут не причем

остается понять где баг в Tomcat или Firefox вродне непонятно
вроде как по идее браузер должен кодировать в UTF-8 но не делает этого

кроме того если вручную прибавить к Content-Type кодировку
Код: plaintext
application/x-www-form-urlencoded; charset=utf-8
то все работает нормально, можно увидеть содержимое

здесь вот https://habrahabr.ru/post/140270/
в принципе тот же результат
...
Рейтинг: 0 / 0
09.06.2017, 19:45
    #39469782
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему post передаёт в кодировке iso-8859-1?
azsx, https://www.w3schools.com/charsets/ref_html_8859.asp ISO-8859-1
ISO-8859-1 is the default character in HTML 4.01.

ISO (The International Standards Organization) defines the standard character sets for different alphabets/languages.

The different variants of ISO-8859 are listed at the bottom of this page.
...
...
Рейтинг: 0 / 0
09.06.2017, 19:47
    #39469784
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему post передаёт в кодировке iso-8859-1?
Usman,

у него в meta же переопределена кодировка.
...
Рейтинг: 0 / 0
09.06.2017, 20:40
    #39469798
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему post передаёт в кодировке iso-8859-1?
тут без Вади не обойтисьazsxВесь код моего сервелёта bot. Сперва открывается index.html (utf-8) указал его в web.xml. Затем по ссылке перехожу на страницу bot (utf-8) затем пытаюсь вводить по русски и отправляьб запрос.
На сегодня сдаюсь, потом подумаю.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
package test;

import com.sun.java.swing.plaf.windows.resources.windows;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name = "bot", urlPatterns = {"/bot"})
public class bot extends HttpServlet {
    

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        try (PrintWriter out = response.getWriter()) {
            /* TODO output your page here. You may use following sample code. */
            out.println("<!DOCTYPE html>");
            out.println("<html>");
            out.println("<head>");
            out.println("<meta charset=\"utf-8\" />");
            out.println("<title>Servlet bot</title>");            
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>main</h1>"); 
            

            out.println("<form action=\"bot\" method=\"POST\">");
    out.println("<p>Введите имя пользователя: <input type=\"text\" name=\"username\"></p>");
    out.println("<input type=\"submit\" value=\"Отправить\" />");
out.println("</form>");
            
            out.println("</body>");
            out.println("</html>");
            

        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        processRequest(request, response);
    }


    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        //response.getWriter().println("<%@page pageEncoding=\"UTF-8\" %>");
                     String username = (String) request.getParameter("username");
                     //String righusername = new String(username.getBytes("iso-8859-1"),"utf-8");
                     String righusername = username;
                     righusername = righusername.toUpperCase();
    
            response.getWriter().println("<!DOCTYPE html><html><head><meta charset=\"utf-8\" /><title>Servlet bot</title></head><body><h1>to</h1><BR>");
charset=\"utf-8\">");
    
    response.getWriter().println("<p>Ваше имя: " + righusername + "</p>");
    
                response.getWriter().println("<form action=\"bot\" method=\"POST\">");
    response.getWriter().println("<p>Введите имя пользователя: <input type=\"text\" name=\"username\"></p>");
    response.getWriter().println("<input type=\"submit\" value=\"Отправить\" />");
response.getWriter().println("</form>");
            
            response.getWriter().println("</body></html>");

       // processRequest(request, response);
    }

    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}

...
Рейтинг: 0 / 0
09.06.2017, 20:42
    #39469799
Usman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему post передаёт в кодировке iso-8859-1?
HettUsman,

у него в meta же переопределена кодировка.Она не совсем определена, а скорее печатается
...
Рейтинг: 0 / 0
09.06.2017, 21:28
    #39469805
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему post передаёт в кодировке iso-8859-1?
Usmanтут без Вади не обойтись
а что за ide?
в какой кодировке?
...
Рейтинг: 0 / 0
09.06.2017, 21:42
    #39469808
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему post передаёт в кодировке iso-8859-1?
ьак лучше

out.println("<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>");
...
Рейтинг: 0 / 0
09.06.2017, 21:47
    #39469812
azsx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему post передаёт в кодировке iso-8859-1?
Всем большое спасибо, помог совет Hett
авторresponse.setCharacterEncoding("UTF-8");
request.setCharacterEncoding("UTF-8");
То есть я поставил и запрос и ответ в трёх местах, чтобы он был utf-8 и сразу заработало. Решено.
---
авторНу или в конфигах настрой
Hett, Usman -- но я же по совету выше уже указал в конфиге server.xml
автор <Connector port="8080" protocol="HTTP/1.1"

connectionTimeout="20000"

redirectPort="8443" URIEncoding="UTF-8" />
<!-- useBodyEncodingForURI="true" -->
Только он почему то не ставится utf-8, а возвращает по дефолтным настройкам iso-8859-1. Какой мне конфиг надо исправить?
Или где посоветуете почитать настройку tomcat на русском?
---
Вадя, я пробую в netbeans, проект у меня в utf-8.
...
Рейтинг: 0 / 0
09.06.2017, 21:59
    #39469816
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему post передаёт в кодировке iso-8859-1?
azsxВадя, я пробую в netbeans, проект у меня в utf-8.
тогда зачем так извращаться ?
он сам всё сделает
...
Рейтинг: 0 / 0
09.06.2017, 22:05
    #39469818
azsx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему post передаёт в кодировке iso-8859-1?
Вадя нет netbeans сам поставил только строку
response.setContentType("text/html;charset=UTF-8");
и то ниже, чем другой вывод (точно уже не помню).
Самое главное я разобрался. Вдруг враги netbeans сопрут и в notepad++ писать заставят :)
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Почему post передаёт в кодировке iso-8859-1? / 25 сообщений из 27, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]