Проблема кодирования с использованием Spring MVC - PullRequest
14 голосов
/ 02 июня 2010

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

@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";
    }

мой 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, но, похоже, это не сработало.

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

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

Ответы [ 6 ]

11 голосов
/ 15 марта 2011

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

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

7 голосов
/ 19 июля 2010

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

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

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

2 голосов
/ 02 июня 2010

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

1 голос
/ 18 октября 2012

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

0 голосов
/ 25 марта 2013

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

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

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

0 голосов
/ 02 июня 2010

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

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

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