Кодировка весны MVC UTF-8



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



изменить 2:



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



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



спасибо.

993   8  

8 ответов:

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

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

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

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

вот свойство, которое вам нужно установить в pom.xml file:

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

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

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

проблема в том, что невозможно сказать, какая кодировка была использована для сохранения файла. Ваш единственный вариант-открыть файл, используя определенную кодировку, и проверить, является ли содержание имеет смысл. Вы также можете попытаться преобразовать файл из предполагаемой кодировки в нужную кодировку с помощью iconv - если это приведет к ошибке, ваше предположение было неверным. Так что если вы предполагаете, что привет.JSP-это в кодировке UTF-8, запустите "программу iconv -F в кодировке UTF-16 -T в кодировке UTF-8 Здравствуйте.jsp " и проверить на наличие ошибок.

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

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

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

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

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

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

на @RequestMapping использовать:

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

чтобы решить эту проблему вам нужно выполнить следующие три шага:

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

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

    <filter>
        <filter-name>encodingFilter</filter-name>
            <filter-lass>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>
    
  3. установите кодировку ресурсов в UTF-8, в случае, если вы пишете любые символы UTF-8 в коде Java или JSP напрямую.

В дополнение к ответу Вениамина - в случае, если вы используете 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 ...
    }
}

заказ всех фильтров в весенней безопасности доступен здесь: 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 из интернета.xml, если он есть.

Comments

    Ничего не найдено.