leftso 1689 0 2019-04-21 09:26:32

文章位置:左搜> 编程技术> 正文

一.application.properties中文乱码问题来源

中文乱码

Spring Boot 项目,在默认的配置文件application.properties中配置了中文的值。导致应用系统中读取出来的中文值乱码。

二.网络流传解决办法

idea中的操作是:
IDEA中设置 File EncodingsTransparent native-to-ascii conversion为true

并且前提是application.properties文件编码已经是UTF-8

实际上这种办法也只是掩耳盗铃,如果你在生产环境中改该值还是需要将中文转换为Unicode码,因为上述的办法其实就是将中文转换为Unicode码然后再在idea编辑器中转换为中文。实际存放的还是Unicode码。

三.application.properties中文乱码原因

application.properties中文乱之所以乱码是应spring boot项目默认的加载配置文件application是通过字符集ISO-8859-1载入的
 

四.application.properties中文乱码解决办法

办法一:
就是网络流传的将中文转换为Unicode码

办法二:
创建一个新的properties配置文件,文件编码格式为UTF-8
然后在spring boot项目需要使用的地方通过注解
@PropertySource(value = "classpath:test.properties",encoding = "UTF-8")
引入配置并指定字符集,然后使用的时候
 @Value("${test.cn}")
    String testCn;
下面是一个demo的两个文件
$title(test.properties)
test.cn=测试中文
$title(DemoTestApplication.java)
package com.example.demotest;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.PropertySource;

import javax.annotation.PostConstruct;

@SpringBootApplication
@PropertySource(value = "classpath:test.properties",encoding = "UTF-8")
public class DemoTestApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoTestApplication.class, args);
    }

    @Value("${test.cn}")
    String testCn;
    @PostConstruct
    public void test(){
        System.out.println("中文是否乱码呢:"+testCn);
    }

}
输出结果:
2019-04-20 10:27:21.636  INFO 16200 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.17]
2019-04-20 10:27:21.750  INFO 16200 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2019-04-20 10:27:21.750  INFO 16200 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 996 ms
中文是否乱码呢:测试中文
2019-04-20 10:27:21.938  INFO 16200 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2019-04-20 10:27:22.118  INFO 16200 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2019-04-20 10:27:22.121  INFO 16200 --- [           main] c.example.demotest.DemoTestApplication   : Started DemoTestApplication in 1.863 seconds (JVM running for 4.082)
很明显没乱码了并且test.properties内配置的是实实在在的中文,非Unicode码,在其他环境也方便修改。