Весеннее кодирование с помощью CharacterEncodingFilter в web.xml - PullRequest
3 голосов
/ 26 марта 2011

Кодировка на stackoverflow.com

{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎ ±ÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö±øùúûüýþŸ▲►▼◄■□▣▤▥▦▧▨▩▪▫◊○●☺☻☼€¢£¥¤♀♂♂♠♤♣♧♥""♡♦★☆⌂№☎☏♨☜☞♩♪♫♬♭†‡←↑→↓↔↕↖↗↘↙×÷+-Ω√¼½¾⅓⅔⅛⅜⅜⅝%‰¹²³

Кодирование на моем сайте:

{|}~???????????????????????????¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎ ±ÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö±øùúûüýþ?????¦???????????????¤?¢£¥¤????????""????¦???????????????????????×÷+-Ov¼½¾??????%?¹²³

Решение:

<#ftl attributes={"content_type":"text/html"} encoding="UTF-8"/>

и поместите это в мой HttpsCoookieFilter:

        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=UTF-8");

Очевидно, почему-то я (ab) использую HttpServlet вместо Freemarker для генерации HTML-контента, используя out.write (), поэтому я добавил выше.

Вот источник сервлета.Любые советы о том, как его изменить, приветствуются:

public class HttpsCookieFilter implements Filter {
private static Logger log = Logger.getLogger(HttpsCookieFilter.class);

@Override
public void destroy() {
}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

    final HttpServletRequest req = (HttpServletRequest) request;
    final HttpServletResponse res = (HttpServletResponse) response;

        req.setCharacterEncoding("UTF-8");
        res.setCharacterEncoding("UTF-8");
        res.setContentType("text/html; charset=UTF-8");

    final HttpSession session = req.getSession(false);

    if (session != null) {
        setCookie(req, res);
    }
    try {
        chain.doFilter(req, res);
    } catch (IllegalStateException e) {
        log.warn("HttpsCookieFilter redirect problem! ", e);
    }
}

@Override
public void init(FilterConfig arg0) throws ServletException {
}

private void setCookie(HttpServletRequest request, HttpServletResponse response) {
    Cookie cookie = new Cookie("JSESSIONID", request.getSession(false).getId());
    cookie.setMaxAge(-1);
    cookie.setPath(getCookiePath(request));
    cookie.setSecure(false);
    response.addCookie(cookie);
}

private String getCookiePath(HttpServletRequest request) {
    String contextPath = request.getContextPath();
    return contextPath.length() > 0 ? contextPath : "/";
}
}

Теперь UTF-8 работает везде;) Спасибо, BalusC !!!

Ответы [ 2 ]

8 голосов
/ 26 марта 2011

Вопросительные знаки обычно используются, когда символьно-байтовый преобразователь / пишущий сам знает о кодировке, символы на самом деле закодированы в и кодировки, которую имеют символы быть декодированным. Если набор символов для декодирования не поддерживает определенный символ в исходной кодировке, он преобразуется в знак вопроса.

В среднем веб-приложении с базой данных базы данных это может произойти в двух местах:

  1. Когда данные пользователя будут вставлены / обновлены в БД.
  2. Когда тело ответа HTTP будет написано и отправлено клиенту.

В обоих случаях используется сеть TCP / IP, которая понимает только байты, и сервер и клиент обычно знают о кодировке, используемой с обеих сторон. Во всех остальных случаях вы бы видели Моджибаке .

Чтобы охватить первый случай, вам необходимо убедиться, что БД и таблица сконфигурированы для использования UTF-8. Вы обычно указываете это во время CREATE. Вот пример на диалекте MySQL.

CREATE DATABASE db_name CHARACTER SET utf8;
CREATE TABLE tbl_name (...) CHARACTER SET utf8;

С некоторыми драйверами JDBC, такими как MySQL, вы также должны указать самому драйверу команду использовать UTF-8.

jdbc:mysql://localhost:3306/db_name?useUnicode=yes&characterEncoding=UTF-8

Чтобы охватить второй случай, вам нужно убедиться, что автору ответов дано указание использовать UTF-8 для декодирования символов в байты. При использовании JSP в качестве представления достаточно добавить следующее к верхней части каждой страницы JSP (также включающей в себя) (это не только устанавливает кодировку ответа, но и неявно устанавливает правильный заголовок ответа).

<%@ page pageEncoding="UTF-8" %>

Смотри также:


Что касается фильтра кодировки символов Spring, который вы используете в данный момент, он только устанавливает кодировку запроса, чтобы вы могли убедиться, что отправленные данные интерпретируются как UTF-8. Все, что в основном делает, это следующее:

request.setCharacterEncoding("UTF-8");

и больше ничего. Обратите внимание, что это касается только запросов POST, для запросов GET вам все равно потребуется настроить веб-сервер для интерпретации URL-адресов как UTF-8.

1 голос
/ 22 февраля 2012

в контексте XML вашего сервлет-диспетчера, вы должны добавить свойство "<property name="contentType" value="text/html;charset=UTF-8" />" на вашем бине viewResolver. мы используем freemarker для просмотров.

выглядит примерно так:

<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
       ...
       <property name="contentType" value="text/html;charset=UTF-8" />
       ...
</bean>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...