java - acentos - ã a ñ
Codificación Spring MVC UTF-8 (8)
Por el momento estoy tratando de comenzar con Spring MVC. Mientras probaba cosas me encontré con un problema de codificación.
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:
<%@ 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>
Como resultado, sigo:
Hello world!
ö
ölm
Tenga en cuenta que el siguiente código <c:out value="ö" />
se visualizó sin error de codificación. También configuré la codificación 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 codificación 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.
Además de la respuesta de Benjamin (que solo he desnatado), debe asegurarse de que sus archivos se almacenen con la codificación 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é codificación se ha usado para almacenar un archivo. Su única opción es abrir el archivo utilizando una codificación específica y verificar si el contenido tiene sentido o no. También puede tratar de convertir el archivo de la codificación asumida a la codificación 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 codificación del archivo de texto (Preferencias / General / Espacio de trabajo) esté configurada en UTF-8 (desafortunadamente se usa de manera predeterminada en la codificación de la plataforma de su sistema).
Lo que hace que los problemas de codificación 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.
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 codificación 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í.
Asegúrese de registrar el CharacterEncodingFilter
de Spring en su web.xml
(debe ser el primer filtro en ese archivo).
<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>
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 checklist de checklist concisa a seguir. Definitivamente lo guiará para que esto funcione.
Bien chicos, encontré el motivo de mi problema de codificación.
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 codificación UTF-8. Por lo tanto, Maven acaba de tomar la codificación predeterminada de mi sistema que es MacRoman y compilarla con la codificación 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
:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
...
</properties>
Gracias chicos por toda su ayuda. ¡Sin ustedes no podría resolver esto!
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.
La solución más fácil para forzar la codificación 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:
Establezca la codificación de página en UTF-8 como a continuación:
<%@ page language="java" pageEncoding="UTF-8"%> <%@ page contentType="text/html;charset=UTF-8" %>
Establezca el filtro en el archivo web.xml de la siguiente manera:
<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>
Establezca la codificación de recursos en UTF-8, en caso de que esté escribiendo caracteres UTF-8 en código Java o JSP directamente.
Según cómo represente su vista, también puede necesitar:
@Bean
public StringHttpMessageConverter stringHttpMessageConverter() {
return new StringHttpMessageConverter(Charset.forName("UTF-8"));
}