出现错误:解决IDEA的properties文件\uxxxx中文乱码问题

关于IDEA的文件编码设置参考点击查看

单个文件转换

方法一
当前项目设置中勾选Transparent native-to-ascii conversion,此时不显示乱码,再把全部内容Ctrl + A全选,再Ctrl + X剪切,
此时再取消勾选,再进行Ctrl + V粘贴即可。

方法二
环境变量中要配置JDK的bin路径,例如:C:\Program Files\Java\jdk1.8.0_172\bin

1
2
3
4
5
6
native2ascii -reverse -encoding UTF-8 转换前的文件 转换后的文件

例子1,application.properties不变,新建一个文件application2.properties,如果原文件已存在,就删除之后再新建。(覆盖)
native2ascii -reverse -encoding UTF-8 D:\application.properties D:\application2.properties
例子2,可以直接进行替换
native2ascii -reverse -encoding UTF-8 D:\application.properties D:\application.properties

批量转换

如果文件较多,你不可能一直使用单文件转换的方法一吧,这样太麻烦了。
我搜索了网上的教程,整理出来下面的方法。根据单文件转换的方法二进行改进。
1)、导入依赖

1
2
3
4
5
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>

2)、执行之前,把path变量换成你要扫描的路径即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//打印.properties不为编码UTF-8的,输出CMD命令字符串,执行即可转换为UTF-8
public static void main(String[] args) throws Exception{
//要注意:环境变量中要配置 C:\Program Files\Java\jdk1.8.0_172\bin
//指定扫描的路径
String path = "D:\\test";
path = "D:\\Everything\\IDEA\\MyProject\\SpringBoot-高级";
path = "D:\\Everything\\IDEA\\MyProject";
//按照路径匹配.properties结尾的文件。
Collection<File> files = FileUtils.listFiles(new File(path), new SuffixFileFilter(".properties"), DirectoryFileFilter.INSTANCE);

AtomicInteger atomicInteger = new AtomicInteger(1);//用来计数
StringBuilder stringBuilder = new StringBuilder();//用来拼接CMD命令
files.forEach((file) ->
{
String fileAbsolutePath = file.getAbsolutePath();
String charset = MyFileUtils.charset(fileAbsolutePath);
if (!"UTF-8".equals(charset))
{
//使用C:\Program Files\Java\jdk1.8.0_172\bin\native2ascii.exe进行转换

//方式1,直接复制整行【推荐】
stringBuilder.append("native2ascii -reverse -encoding UTF-8 " + fileAbsolutePath + " " + fileAbsolutePath + ";");
//方式2,后面要多复制一个空格
//stringBuilder.append("native2ascii -reverse -encoding UTF-8 " + fileAbsolutePath + " " + fileAbsolutePath + "\n");
System.out.println(atomicInteger.getAndIncrement() + "--------" + charset + "--------" + fileAbsolutePath);
}
});
System.out.println(stringBuilder.toString());//打印命令
//方式1 一行命令
//native2ascii -reverse -encoding UTF-8 D:\test\application1.properties D:\test\application1.properties;native2ascii -reverse -encoding UTF-8 D:\test\application2.properties D:\test\application2.properties;native2ascii -reverse -encoding UTF-8 D:\test\application3.properties D:\test\application3.properties;
//方式2 多行命令,注意最后面有一个换行
//native2ascii -reverse -encoding UTF-8 D:\test\application1.properties D:\test\application1.properties
//native2ascii -reverse -encoding UTF-8 D:\test\application2.properties D:\test\application2.properties
//native2ascii -reverse -encoding UTF-8 D:\test\application3.properties D:\test\application3.properties
//
System.out.println("\ndone...");
}

3)、把控制台打印的native2ascii…命令进行复制,使用CMD执行即可。