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?
Спасибо.
Ответы
Ответ 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
Чтобы решить эту проблему вам нужно три шага ниже:
-
Установите кодировку страницы в UTF-8, как показано ниже:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page contentType="text/html;charset=UTF-8" %>
-
Установите фильтр в файле 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>
-
Установите кодировку ресурса в UTF-8, если вы пишете какие-либо символы UTF-8 непосредственно в коде Java или JSP.