I have this in web.xml
<filter>
<filter-name>encoding-filter</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>encoding-filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
and at the top of file.jsp I have this:
<%@ page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>
in <head>
this:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
and characters other than latin-1 set from FORM with method POST are still not correct.
I solved this.
That filter in web.xml must be first filter in file.
I had similar problem. When I post a form and save it in DB, it is inserted as ?????? but if I manually insert to DB using the MySQL WorkBench it works fine.
I thought the problem is only in http request encoding. So, I almost implemented all recommendations I found about this issue like change server.xml, adding filter to web.xml and changing settings in MySQL config file my.ini but it does not solve my problem.
The problem was due to two things the http request encoding and the JDBC connection. For some reason MySQL is accepting data as ISO-8859-1 not as UTF-8.
So, I reverted all changes and I made below two changes:
Change Tomcat server.xml as below:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />
Change Jdbc connection properties as below:
jdbc.driver_class=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost/dB_Name?useUnicode=yes&characterEncoding=UTF-8
jdbc.username=root
jdbc.password
The solution key here is adding useUnicode=yes&characterEncoding=UTF-8
Add a filter like @jbb did in **web.xml:**
<filter>
<filter-name>encoding-filter</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>encoding-filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
If Thymeleaf is used, change viewResolver and TemplateResolver as below:
viewResolver.setCharacterEncoding("UTF-8");
viewResolver.setContentType("text/html; charset=UTF-8");
templateResolver.setCharacterEncoding("UTF-8");
Note that this works only for POST requests. If you want to code also GET requests (i.e. links with <a href=...>
), you will have to modify your server's server.xml file, by adding URIEncoding="UTF-8" useBodyEncodingForURI="true"
attributes in the <Connector>
tag.
See : http://wiki.apache.org/tomcat/FAQ/CharacterEncoding