Spring MVC UTF-8 Кодировка - PullRequest
       15

Spring MVC UTF-8 Кодировка

56 голосов
/ 08 мая 2011

В данный момент я пытаюсь начать работу с Spring MVC. Испытывая вещи, я столкнулся с проблемой кодировки.

Я хочу отображать символы UTF-8 на моих страницах JSP, поэтому я добавил строку с символами UTF-8 в свой ModelAndView. Это выглядит так:

@Controller
public class HomeController {

    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

    @RequestMapping(value="/", method=RequestMethod.GET)
    public ModelAndView home() {
        logger.info("Welcome home!");
        return new ModelAndView("home", "utftest", "ölm");
    }

}

На странице JSP я просто хочу отобразить строку с символами UTF-8 следующим образом:

<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Home</title>
</head>
<body>
    <h1>Hello world!</h1>
    <p><c:out value="ö" /></p>
    <p><c:out value="${utftest}"></c:out></p>
</body>
</html>

В результате получаю следующее:

Hello world!

ö

ölm

Обратите внимание, что следующий код <c:out value="ö" /> отображался без ошибки кодирования. Я также установил кодировку по умолчанию на UTF-8 в Springsource Tool Suite, но я все еще получаю неправильные символы.

Edit:

Возможно, мне следовало упомянуть, что я использую Mac с OS X 10.6. Для разработки Spring я использую Springsource Tool Suite от Spring (http://www.springsource.com/developer/sts). Надеюсь, это поможет выяснить, что не так с моими настройками.

Редактировать 2:

Благодаря McDwell, я только что попробовал использовать "\u00f6lm" вместо "ölm" в моем контроллере, и проблема с кодированием на странице JSP исчезла.

Значит ли это, что мои файлы .java закодированы с неправильным набором символов? Где я могу изменить это в Eclipse?

Спасибо.

Ответы [ 9 ]

117 голосов
/ 08 мая 2011

Убедитесь, что вы зарегистрировали CharacterEncodingFilter Spring в вашем web.xml (должен быть первым фильтром в этом файле).

<filter>  
    <filter-name>encodingFilter</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>encodingFilter</filter-name>  
    <url-pattern>/*</url-pattern>  
</filter-mapping> 

Если вы используете Tomcat, возможно, вы не установили URIEncodingв вашем server.xml.Если вы не установите его в UTF-8, он не будет работать.Определенно держите CharacterEncodingFilter.Тем не менее, вот краткий контрольный список для подражания.Это определенно поможет вам сделать эту работу.

38 голосов
/ 09 мая 2011

Хорошо, ребята, я нашел причину моей проблемы с кодировкой.

Ошибка была в моем процессе сборки.Я не сказал Maven в моем pom.xml файле для создания проекта с кодировкой UTF-8.Поэтому Maven просто взял кодировку по умолчанию из моей системы, то есть MacRoman, и собрал ее с кодировкой MacRoman.

К счастью, Maven предупреждает вас об этом при создании вашего проекта (НО есть большая вероятность, что предупреждение исчезнет с вашего экрана из-за всех других сообщений).Свойство, которое необходимо установить в файле pom.xml:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    ...
</properties>

Спасибо, ребята, за вашу помощь.Без вас, ребята, я бы не смог этого понять!

14 голосов
/ 08 мая 2011

В дополнение к ответу Бенджамина (который я только просмотрел) вам необходимо убедиться, что ваши файлы действительно хранятся с использованием правильной кодировки (это будет UTF-8 для исходного кода, JSP и т. Д., Но обратите внимание, чтоФайлы свойств Java должны быть закодированы как ISO 8859-1 по определению).

Проблема в том, что невозможно определить, какая кодировка использовалась для хранения файла.Единственный вариант - открыть файл, используя определенную кодировку, и проверить, имеет ли смысл содержание.Вы также можете попытаться преобразовать файл из предполагаемой кодировки в желаемую кодировку, используя iconv - если это приводит к ошибке, ваше предположение было неверным.Поэтому, если вы предполагаете, что hello.jsp кодируется как UTF-8, запустите "iconv -f UTF-16 -t UTF-8 hello.jsp" и проверьте наличие ошибок.

Если вы обнаружите, что вашфайлы не закодированы должным образом, вам нужно выяснить, почему.Вероятно, это редактор или IDE, который вы использовали для создания файла.В случае Eclipse (и STS) убедитесь, что для параметра Кодировка текстового файла (Preferences / General / Workspace) установлено значение UTF-8 (к сожалению, по умолчанию используется кодировка платформы вашей системы).

Что делает проблемы кодирования такимиТрудно отлаживать то, что задействовано так много компонентов (текстовый редактор, borwser, плюс каждый промежуточный программный компонент, в некоторых случаях включая базу данных), и каждый из них может привести к ошибке.

7 голосов
/ 10 июля 2018

В дополнение к ответу Бенджамина - в случае, если вы используете Spring Security , размещение CharacterEncodingFilter в web.xml может не всегда работать.В этом случае вам нужно создать собственный фильтр и добавить его в цепочку фильтров в качестве первого фильтра.Чтобы убедиться, что это первый фильтр в цепочке, вам нужно добавить его перед ChannelProcessingFilter, используя addFilterBefore в вашем WebSecurityConfigurerAdapter:

@Configuration
@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter {


    @Override
    protected void configure(HttpSecurity http) throws Exception {

        //add your custom encoding filter as the first filter in the chain
        http.addFilterBefore(new EncodingFilter(), ChannelProcessingFilter.class);

        http.authorizeRequests()
            .and()
            // your code here ...
    }
}

Порядок всех фильтров в Spring Security доступен здесь: HttpSecurityBuilder - addFilter ()

Ваш пользовательский фильтр кодировки UTF-8 может выглядеть следующим образом:

public class EncodingFilter extends GenericFilterBean {

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

        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");

        chain.doFilter(request, response);
    }
}

Не забудьте добавить в свои файлы jsp:

<%@ page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>

И удалите CharacterEncodingFilter из web.xml, если он там есть.

5 голосов
/ 01 февраля 2018

Самое простое решение для принудительного кодирования UTF-8 в Spring MVC, возвращающее строку:

В @RequestMapping, используйте:

produces = MediaType.APPLICATION_JSON_VALUE + "; charset=utf-8"
4 голосов
/ 09 мая 2011

щелкните правой кнопкой мыши на свой controller.java, затем выберите свойства и проверьте, не закодирован ли ваш текстовый файл с помощью utf-8, если нет, то это ваша ошибка.

3 голосов
/ 22 февраля 2017

Чтобы решить эту проблему, вам нужно выполнить три шага:

  1. Установить кодировку страницы в UTF-8, как показано ниже:

    <%@ page language="java" pageEncoding="UTF-8"%>
    <%@ page contentType="text/html;charset=UTF-8" %>
    
  2. Установите фильтр в файле web.xml, как показано ниже:

    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
  3. Установите кодировку ресурса в UTF-8, если вы пишете какие-либо символы UTF-8 непосредственно в коде Java или JSP.

3 голосов
/ 06 апреля 2014

В зависимости от того, как вы отображаете вид, вам также может понадобиться:

@Bean
public StringHttpMessageConverter stringHttpMessageConverter() {
    return new StringHttpMessageConverter(Charset.forName("UTF-8"));
}
0 голосов
/ 25 февраля 2019

Работает для меня, как здесь Spring MVC Java config

добавлено в веб-инициализатор

 @Override
      protected Filter[] getServletFilters() {

        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        return new Filter[] { characterEncodingFilter};
      }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...