Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UTF-8 encoding in Spring MVC, problem with FORMs

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.

like image 758
jbb Avatar asked Feb 28 '11 11:02

jbb


2 Answers

I solved this.

That filter in web.xml must be first filter in file.

like image 129
jbb Avatar answered Sep 20 '22 11:09

jbb


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"); 
like image 33
Ayman Al-Absi Avatar answered Sep 18 '22 11:09

Ayman Al-Absi