Codificación Spring MVC UTF-8

Por el momento estoy tratando de comenzar con Spring MVC. Mientras probaba cosas me encontré con un problema de encoding.

Quiero mostrar los caracteres UTF-8 en mis páginas JSP, así que agregué un String con caracteres UTF-8 a mi ModelAndView. Se parece a esto:

@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"); } } 

En la página JSP solo quiero mostrar el String con caracteres UTF-8 como este:

        Home   

Hello world!

Como resultado, sigo:

 Hello world! ö √∂lm 

Tenga en cuenta que el siguiente código se visualizó sin error de encoding. También configuré la encoding predeterminada para UTF-8 en Springsource Tool Suite, pero sigo obteniendo caracteres incorrectos.

Editar:

Tal vez debería haber mencionado que estoy usando una Mac con OS X 10.6. Para el desarrollo de Spring utilizo Springsource Tool Suite de Spring (http://www.springsource.com/developer/sts). Espero que esto ayude a descubrir qué está mal con mi configuración.

Editar 2:

Gracias a McDwell, simplemente probé usando "\u00f6lm" lugar de "ölm" en mi controlador y el problema de encoding en la página JSP se ha ido.

¿Eso significa que mis archivos .java están codificados con un juego de caracteres incorrecto? ¿Dónde puedo cambiar esto en Eclipse?

Gracias.

Asegúrese de registrar el CharacterEncodingFilter de Spring en su web.xml (debe ser el primer filtro en ese archivo).

  encodingFilter org.springframework.web.filter.CharacterEncodingFilter  encoding UTF-8   forceEncoding true    encodingFilter /*  

Si está en Tomcat, es posible que no haya configurado la URIEncoding en su server.xml . Si no lo configura en UTF-8, no funcionará. Definitivamente mantenga el CharacterEncodingFilter . Sin embargo, aquí hay una lista de control concisa a seguir. Definitivamente lo guiará para que esto funcione.

Bien chicos, encontré el motivo de mi problema de encoding.

La falla fue en mi proceso de construcción. No le dije a Maven en mi archivo pom.xml que construyera el proyecto con la encoding UTF-8. Por lo tanto, Maven acaba de tomar la encoding predeterminada de mi sistema que es MacRoman y comstackrla con la encoding MacRoman.

Afortunadamente, Maven le advierte al respecto cuando construye su proyecto (PERO hay una buena posibilidad de que la advertencia desaparezca rápidamente de su pantalla debido a todos los otros mensajes).

Aquí está la propiedad que necesita establecer en el archivo pom.xml :

  UTF-8 ...  

Gracias chicos por toda su ayuda. ¡Sin ustedes no podría resolver esto!

Además de la respuesta de Benjamin (que solo he desnatado), debe asegurarse de que sus archivos se almacenen con la encoding adecuada (que sería UTF-8 para el código fuente, JSP, etc., pero tenga en cuenta que los archivos de propiedades de Java) debe estar codificado como ISO 8859-1 por definición).

El problema con esto es que no es posible decir qué encoding se ha usado para almacenar un archivo. Su única opción es abrir el archivo utilizando una encoding específica y verificar si el contenido tiene sentido o no. También puede tratar de convertir el archivo de la encoding asumida a la encoding deseada usando iconv, si eso produce un error, su suposición fue incorrecta. Por lo tanto, si supone que hello.jsp está codificado como UTF-8, ejecute “iconv -f UTF-16 -t UTF-8 hello.jsp” y compruebe si hay errores.

Si descubres que tus archivos no están codificados correctamente, debes averiguar por qué. Probablemente sea el editor o IDE que utilizó para crear el archivo. En el caso de Eclipse (y STS), asegúrese de que la encoding del archivo de texto (Preferencias / General / Espacio de trabajo) esté configurada en UTF-8 (desafortunadamente se usa de manera predeterminada en la encoding de la plataforma de su sistema).

Lo que hace que los problemas de encoding sean tan difíciles de depurar es que hay tantos componentes involucrados (editor de texto, borwser, más todos y cada uno de los componentes intermedios, en algunos casos incluyendo una base de datos), y cada uno de ellos tiene el potencial de introducir un error.

Haga clic derecho en su controller.java y luego en propiedades y verifique si su archivo de texto está codificado con utf-8, si no es este su error.

Según cómo represente su vista, también puede necesitar:

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

La solución más fácil para forzar la encoding UTF-8 en Spring MVC Returing String:

En @RequestMapping , use:

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

Para resolver este problema, necesita tres pasos a continuación:

  1. Establezca la encoding de página en UTF-8 como a continuación:

     < %@ page language="java" pageEncoding="UTF-8"%> < %@ page contentType="text/html;charset=UTF-8" %> 
  2. Establezca el filtro en el archivo web.xml de la siguiente manera:

      encodingFilter org.springframework.web.filter.CharacterEncodingFilter   encoding UTF-8   forceEncoding true    encodingFilter /*  
  3. Establezca la encoding de recursos en UTF-8, en caso de que esté escribiendo caracteres UTF-8 en código Java o JSP directamente.

Además de la respuesta de Benjamin, en caso de que esté usando Spring Security , colocar el CharacterEncodingFilter en web.xml podría no funcionar siempre. En este caso, debe crear un filtro personalizado y agregarlo a la cadena de filtros como primer filtro. Para asegurarse de que sea el primer filtro de la cadena, debe agregarlo antes de ChannelProcessingFilter en su 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 ... } } 

El orden de todos los filtros en Spring Security está disponible aquí: HttpSecurityBuilder – addFilter ()

El filtro de encoding UTF-8 de su cliente puede verse como sigue:

 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); } } 

No olvides agregar tus archivos jsp:

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

Y elimine el CharacterEncodingFilter de web.xml si está allí.