Подтвердить что ты не робот

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

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

Я хочу отображать символы UTF-8 на моих JSP-страницах, поэтому я добавил String с символами 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 от Spring (http://www.springsource.com/developer/sts). Надеюсь, что это поможет выяснить, что не так с моей настройкой.

Изменить 2:

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

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

Спасибо.

4b9b3361

Ответ 1

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

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

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

Вот свойство, которое необходимо установить в файле pom.xml:

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

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

Ответ 2

Убедитесь, что вы зарегистрировали Spring CharacterEncodingFilter в 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. Тем не менее, здесь следует сжатый контрольный список. Это определенно поможет вам сделать эту работу.

Ответ 3

В дополнение к ответу Benjamin (который я только снял) вам нужно убедиться, что ваши файлы хранятся на самом деле с использованием правильной кодировки (это будет 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, плюс каждый компонент программного обеспечения между ними, в некоторых случаях, включая базу данных), и каждый из них может представить ошибка.

Ответ 4

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

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

produces = MediaType.APPLICATION_JSON_VALUE + "; charset=utf-8"

Ответ 5

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

Ответ 6

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

@Bean
public StringHttpMessageConverter stringHttpMessageConverter() {
    return new StringHttpMessageConverter(Charset.forName("UTF-8"));
}

Ответ 7

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

Ответ 8

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

  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.