Могу ли я отправить форму POST в кодировке, отличной от ее тела? - PullRequest
1 голос
/ 06 мая 2010

У меня есть HTML-страница, которая выглядит следующим образом:

<HTML>
<meta http-equiv='Content-Type' content='text/html; charset=gb2312'>
<BODY onload='document.forms[0].submit();'>
<form name="form" method="post" action="/path/to/some/servlet">
<input type="hidden" name="username" value="麗安"> <!-- UTF-8 characters -->
</form>
</BODY>
</HTML>

Как видите, содержимое этой страницы - UTF-8, но мне нужно отправить его с кодировкой символов GB2312, так как сервлет, которому я отправляю эту страницу, ожидает от меня GB2312.

Это действительный сценарий? Потому что в сервлете я не смог получить эти китайские символы обратно, используя фильтр, который устанавливает кодировку символов в GB2312!

Я создал образец сервлета:

package org.daz;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class EncodingServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private static final String ENCODING = "GB2312";

    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {

        setCharacterEncoding(request, response);

        String username = request.getParameter("username");
        System.out.println(username);

    }

    private void setCharacterEncoding(HttpServletRequest request, HttpServletResponse response)throws IOException{
        request.setCharacterEncoding(ENCODING);
        response.setCharacterEncoding(ENCODING);
    }

}

Вывод: 楹��

Ответы [ 3 ]

1 голос
/ 06 мая 2010

Это невозможно. Вместо этого вам нужно будет использовать символы GB2312 с самого начала или изменить все приложение на использование только UTF-8. Вы не можете преобразовать кодировку символов X в кодировку символов Y таким образом. Любой символ вне диапазона ASCII может быть поврежден.

Атрибут accept-charset формы, как полагают некоторые, игнорируется большинством веб-браузеров. Спецификация W3 также буквально заявляет "Агенты пользователя могут интерпретировать .." , а не "must" . И даже в этом случае он будет использоваться только для кодирования фактического пользовательского ввода, а не скрытых полей, как в вашем примере. Они уже закодированы в собственной кодировке страницы (в данном случае GB2312). Другими словами, эти символы UTF-8 уже уже повреждены в момент обработки страницы браузером.

1 голос
/ 06 мая 2010

Вы можете попытаться сделать это,

<form name="form" method="post" action="/path/to/some/servlet" charset="gb2312" accept-encoding="gb2312">
<input type="hidden" name="username" value="麗安"> <!-- UTF-8 characters -->
</form>

Может работать в некоторых браузерах. Однако браузер не обязан поддерживать GB2312, поэтому пробег может отличаться.

0 голосов
/ 06 мая 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...