IDEA中,对properties文件的显示有一项功能 Transparent native-to-ascii conversion
在我的理解中,这个功能是为了解决非英文体系乱码问题,举个例子,以GBK编码方式写入properties文件
abc=中国
如果以UTF-8编码方式去读取,肯定会出现乱码
abc=�й�
而 Transparent native-to-ascii conversion分为两个功能点
- 在检测到当前编码方式是UTF-8,而properties文件的编码方式时GBK时,会将"中国"转换为对应的Unicode编码
\u4e2d\u56fd
- 以UTF-8方式读取时,如果发现形如
\u4e2d\u56fd
这样的Unicode编码,就将其转换为对应的符号展示. 所以如果没有开启功能,展示的会是
abc=\u4e2d\u56fd
开启之后,展示的会是
abc=中国
大部分乱码都是字符编码方式字符集不匹配,关于字符集和字符编码方式请看阮一峰老师的这篇文章
附赠一个代码示例
public static void main(String[] args) throws IOException {
//以GBK编码写入内容
File file = FileUtil.newFile("test1.properties");
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "GBK"));
String s = "abc=中国";
writer.write(s);
writer.flush();
writer.close();
//以 UTF-8编码读取内容
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8));
String str = bufferedReader.readLine();
System.out.println(str);
bufferedReader.close();
//以GBK编码写入内容
file = FileUtil.newFile("test2.properties");
writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "GBK"));
//GB2312字符集的字符"中国"转换为unicode字符集在java中的表示是 "\u4e2d\u56fd"
s = "abc=\\u4e2d\\u56fd";
writer.write(s);
writer.flush();
writer.close();
//以 UTF-8格式读取内容
bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8));
str = bufferedReader.readLine();
System.out.println(str);
bufferedReader.close();
}
输出
//以GBK编码写入中文内容,UTF-8读取.
abc=�й�
//以GBK编码写入unicode内容,UTF-8读取.
abc=\u4e2d\u56fd
在IDEA中点开properties文件时,IDEA会检测它的编码,如果和当前编码不符,会直接将文件编码转换为当前编码. 如果你是用GBK建了一个properties文件,之后又将项目properties的默认编码改为UTF-8,并且没有开启 Transparent native-to-ascii,再次打开后你会得到一个乱码的UTF-8编码的properties文件
网友评论