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