Кодировка UTF-8 и параметры http - PullRequest
       23

Кодировка UTF-8 и параметры http

5 голосов
/ 08 сентября 2010

Я выполняю простой вызов ajax с библиотекой Javascript YahooUI следующим образом:

YAHOO.util.Connect.setForm('myform');
YAHOO.util.Connect.asyncRequest('POST', url, ...);

Ниже приведены настройки в моем приложении: версия Tomcat: 6.0.18

разъем сервера Tomcat: URIEncoding = "UTF-8" страница веб-приложения:

Также указано в документах библиотеки соединителя YahooUI:

setForm закодирует имя и значение каждого поля формы HTML с использованием encodeURIComponent.В результате получается строка из кодированных UTF-8 пар имя-значение.ПРИМЕЧАНИЕ. Установка HTTP-заголовка «Content-Type» с другим значением кодировки не изменит кодировку сериализованных данных. Кодирование сериализованных данных.

Я вижу, что французские символы, которыеотправляются как параметры закодированы (в ie7 с помощью iehttpheader tool):

    name=%C3%88%C3%A0%C3%B4 
    testParam=%C3%B4%C3%B4   

Для данных: name: andàô и testParam: ôô

Но на стороне сервера я вижу значенияследующим образом: • 1019 *

Даже если я преобразовываю строку в байты, а затем создаю новую строку с набором символов, определенным следующим образом: String val = new String (oo.getBytes ("UTF-8"));Я не могу получить точные данные, как ожидалось.

Примечание. Я ссылался на приведенный ниже вопрос, но не смог решить эту проблему: Как заставить UTF-8 работать в веб-приложениях на Java? Пожалуйста, руководство.

ОБНОВЛЕНИЕ: Вызов функции декодирования UTF-8, как указано на сайте W3.org http://www.w3.org/International/O-URL-code.html, дает мне ожидаемые результаты.Я ожидаю, что Tomcat расшифрует это?

Ответы [ 2 ]

7 голосов
/ 08 сентября 2010

Поскольку вы используете запрос POST, URIEncoding="UTF-8" здесь не применимо.Вам нужно установить фильтр, чтобы сообщить Tomcat, что кодировка вашего запроса - UTF-8.Вы можете использовать, например, Spring's CharacterEncodingFilter ( использование , javadoc ).Другие реализации таких фильтров также могут быть найдены.

1 голос
/ 08 сентября 2010

Да, вот один:

package com.lfantastico.web;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class EncodingFilter implements Filter {
    private String encoding = "UTF-8";

    public void destroy() {
    }

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding(encoding);
        response.setCharacterEncoding(encoding);
        chain.doFilter(request, response);
    }

    public void init(FilterConfig config) throws ServletException {
        if (config.getInitParameter("encoding") != null) {
            encoding = config.getInitParameter("encoding");
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...