Проблема с кодированием с помощью Spring MVC

У меня есть демонстрационное веб-приложение, которое создает пользователей. Когда я пытаюсь вставить данные на другие языки (например, французский), символы не кодируются правильно. Код на контроллере:

@SuppressWarnings("unchecked")
    @RequestMapping(value = "/user/create.htm", params={"id"}, method = RequestMethod.GET)
    public String edit(@RequestParam("id") Long id, ModelMap model) {
        System.out.println("id is " + id);
        User user = userService.get(id);

        model.put("user", user);
        return "user/create";
    }

    @RequestMapping(value = "/user/create.htm", method = RequestMethod.POST)
    public String save(@ModelAttribute("user") User user, BindingResult result) {

        System.out.println(user.getFirstName());
        System.out.println(user.getLastName());


        validator.validate(user, result);
        if(result.hasErrors()) {
            return "user/create"; 
        }

        userService.save(user);
        return "redirect:list.htm";
    }

my web.xml:

...

    <filter>
        <filter-name>encoding-filter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>

    </filter>

    <filter-mapping>
        <filter-name>encoding-filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

...

и страница:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

...

<form:form method="post" commandName="user">

...

<form:input path="firstName" cssErrorClass="form-error-field"/>

...

когда я ввожу некоторые французские символы в имени, тогда вывод из system.out.println равен ????+????? или что-то подобное.

Я видел, как другие люди фиксировали это с помощью CharacterEncodingFilter, но это, похоже, не работает.

Большое спасибо.

Отредактировано значение фильтра.

Ответы

Ответ 1

Попробуйте создать CharacterEncodingFilter первый фильтр в web.xml.

Я понимаю, что этот вопрос немного стар, но я столкнулся с той же проблемой, и перемещение CharacterEncodingFilter исправило это для меня.

Ответ 2

Если это все еще не работает, и вы используете Tomcat, поскольку ваш сервер приложений попытается установить следующий параметр для каждого элемента <Connector> в server.xml:

<Connector URIEncoding="UTF-8" ...>
    ...
</Connector>

Это помогло мне. Могут быть аналогичные варианты для других серверов приложений, поэтому вы можете проверить документацию на сервере.

Ответ 3

Возможно, мне что-то не хватает, но если кодировка страницы в вашем JSP "UTF-8", не должна ли кодировка в вашем CharacterEncodingFilter быть UTF-8, а не ISO-8859-7?

Ответ 4

Вам нужно добавить в форму форму accept-charset = "UTF-8".

Ответ 5

Вывод System.out.println() зависит от кодировки консоли, поэтому он не является хорошим способом отладки проблем с кодировкой.

Чтобы проверить правильность декодирования ваших значений, вы должны показать его на другой странице. Фактически, это уже сделано в случае сбоя проверки формы, поэтому ваша система работает нормально, если значения в полях остаются неизменными после ошибки проверки.

Ответ 6

Есть две вещи, которые могут помочь:

  • В вашем файле setenv.sh добавьте JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=utf-8"
  • В script, который запускает ваш процесс tomcat, установите среду LANG: export LANG='utf-8'

Затем это можно проверить, изучив набор символов по умолчанию: Charset.defaultCharset().