Skip to content

Instantly share code, notes, and snippets.

@MahefaAbel
Last active February 8, 2022 08:13
Show Gist options
  • Save MahefaAbel/ffe7e1a7d4d7575b2dd239f91cbecb39 to your computer and use it in GitHub Desktop.
Save MahefaAbel/ffe7e1a7d4d7575b2dd239f91cbecb39 to your computer and use it in GitHub Desktop.
Java Charseting
Can We Override the Default Charset?
-Dfile.encoding="UTF-8"
-Dsun.jnu.encoding="UTF-8"
java -Dfile.encoding=utf-8 -jar target\application.jar
@MahefaAbel
Copy link
Author

  • CharacterEncodingFilter for POST requests
  • URIEncoding (or useBodyEncodingForURI="true") for GET requests

@MahefaAbel
Copy link
Author

MahefaAbel commented Feb 8, 2022

Server Page Encoding
JSPs :

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

XML :
<jsp:directive.page contentType="text/html; charset=UTF-8" />

@MahefaAbel
Copy link
Author

HTML Page Encoding

<meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />

@MahefaAbel
Copy link
Author

MySQL Server Configuration

my.cnf

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

@MahefaAbel
Copy link
Author

MahefaAbel commented Feb 8, 2022

MySQL Database Configuration

ALTER DATABASE database_name CHARACTER SET = utf8mb4 
    COLLATE = utf8mb4_unicode_ci;
ALTER TABLE table_name CONVERT TO 
    CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_name CHANGE column_name column_name 
    VARCHAR(69) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

JDBC Connection URL
jdbc:mysql://localhost:3306/?useUnicode=yes;characterEncoding=UTF-8

<Resource name="jdbc/AppDB" 
        auth="Container"
        type="javax.sql.DataSource"
        maxActive="20" maxIdle="10" maxWait="10000"
        username="foo"
        password="bar"
        driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/      ID_development?useEncoding=true&amp;characterEncoding=UTF-8"
    />

@MahefaAbel
Copy link
Author

MahefaAbel commented Feb 8, 2022

Maven POM Configuration :
pom.xml

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    ...
</properties>

@MahefaAbel
Copy link
Author

MahefaAbel commented Feb 8, 2022

Gradle Configuration :

compileJava.options.encoding = 'UTF-8'

@MahefaAbel
Copy link
Author

Other Render View Config

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

@MahefaAbel
Copy link
Author

Force UTF-8 encoding in Spring MVC returning String

@RequestMapping

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

@MahefaAbel
Copy link
Author

In addition to Benjamin's answer - in case if you are using Spring Security, placing the CharacterEncodingFilter in web.xml might not always work. In this case you need to create a custom filter and add it to the filter chain as the first filter. To make sure it's the first filter in the chain, you need to add it before ChannelProcessingFilter, using addFilterBefore in your 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 ...
    }
}
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);
    }
}

@MahefaAbel
Copy link
Author

[Spring MVC Java config] (https://stackoverflow.com/questions/22225040/spring-mvc-java-config)

@Override
      protected Filter[] getServletFilters() {

        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        return new Filter[] { characterEncodingFilter};
      }

@MahefaAbel
Copy link
Author

MahefaAbel commented Feb 8, 2022

web.xml

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  version="4.0">
  <request-character-encoding>UTF-8</request-character-encoding>
<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <page-encoding>UTF-8</page-encoding>
    </jsp-property-group>
</jsp-config>

Or in Java config :
servletContext.setRequestCharacterEncoding("UTF-8");

@MahefaAbel
Copy link
Author

catalina.sh / catalina.bat - added following

set JAVA_OPTS=--Xms256m -Xmx1024m -Xss268k -server -XX:MaxPermSize=256m -XX:-UseGCOverheadLimit -Djava.awt.headless=true -Djavax.servlet.request.encoding=UTF-8 -Dfile.encoding=UTF-8

set CATALINA_OPTS=-Dfile.encoding="UTF-8"

@MahefaAbel
Copy link
Author

<bean id="templateResolver" class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
    ...
    <property name="characterEncoding" value="UTF-8"/>
    ...
</bean>

<bean class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
    ...
    <property name="characterEncoding" value="UTF-8"/>
    ...
</bean>

@MahefaAbel
Copy link
Author

MahefaAbel commented Feb 8, 2022

In SpringConfig

public class SpringConfig implements WebMvcConfigurer {

    private final ApplicationContext applicationContext;

    @Autowired
    public SpringConfig(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }

    @Bean
    public SpringResourceTemplateResolver templateResolver() {
        SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
        templateResolver.setApplicationContext(applicationContext);
        templateResolver.setPrefix("/WEB-INF/views/");
        templateResolver.setSuffix(".html");
        templateResolver.setCharacterEncoding("UTF-8");
        return templateResolver;
    }

    @Bean
    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(templateResolver());
        templateEngine.setEnableSpringELCompiler(true);
        return templateEngine;
    }

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        ThymeleafViewResolver resolver = new ThymeleafViewResolver();
        resolver.setTemplateEngine(templateEngine());
        resolver.setCharacterEncoding("UTF-8");
        registry.viewResolver(resolver);
    }
}

In ServletInitializer

public class MySpringMvcDispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return null;
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("UTF-8");
        filter.setForceEncoding(true);
        return new Filter[] { filter };
    }
}

@MahefaAbel
Copy link
Author

application.properties

spring.thymeleaf.enabled=true
spring.thymeleaf.encoding=UTF-8

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment