properties文件的编码问题
背景
在复习基础知识的时候, 先复习了properties, 然后又突然心血来潮试了一下使用流直接读取properties文件, 发现使用中文的时候, 两者好像有些不太一样, 使用流读取中文的时候显示的是ascii编码, 而properties获取到的是正确的编码. 下方我将简单的说明一下这些问题出现的原因.
原因
idea的编码问题
此处是我们使用idea前, 经常会进行配置的地方, 用于设置文件的编码格式. 这里有一个针对 properties
类型文件的设置, 前一个选项是设置文件的编码格式, 后一个选项用于控制是否将中文自动转为 ascii 编码. 这里重点说一下后面这个选项.
选中该选项后, idea会自动将输入的中文在文件中转存为ascii编码, 同时, idea加载时, 会将其加载为中文进行展示.
因此, 有了其他博客说的情况: 如果合作项目中, 有人选择了该选项, 该文件的中文, 则全部变成了ansii
编码, 其他人拉代码下来看的时候, 如果没有勾选该选项, 则会看到ansii
编码, 也就是个别老哥认为的乱码问题, 这个时候, 有的博主就会推荐, 勾选上这个选项, 那么问题也就算解决了
但是这个问题的解决, 仅仅是idea中使用时解决, 使用其他文件编辑器打开的时候, 还是会看到ansii
编码, 无法看到中文.
使用流读取properties文件
按照上述所说的方法, 勾选该选项后, 由上述分析, 应该很容易发现, 此时读取properties文件, 会读取到ansii
编码的文字, 这个原因很好理解, 因为此时文件中存储的中文, 本就时ansii
编码的文字
如何使用Properties读取utf-8编码的文件
综上, properties文件常常作为配置文件, 我个人还是比较喜欢配置properties文件为utf8
编码的文件, 方便自己随时使用其他简单的文件编辑器查看注释
但是, 在实际使用的时候, 你又会理解, 为什么 idea 会针对 properties 文件, 提供这么一个特别配置. 因为, 你如果是 utf8 格式的文件, 直接使用 Properties 工具类, 读取配置, 会发现中文乱码, 当然, 你没有中文配置的话, 那当然是万事大吉.
为什么Properties无法正常读取utf8编码的文件
以下代码, 没有任何技术含量, 只是说明一下Properties的编码格式指定位置, 可以跳过不看
// 首先是Properties初始化入口
public synchronized void load(InputStream inStream) throws IOException {
load0(new LineReader(inStream));
}
// ... 其他方法
private void load0 (LineReader lr) throws IOException {
// ...其他语句
// 此处初始化下方获取key, value使用的 lr.lineBuf
while ((limit = lr.readLine()) >= 0) {
// ...其他语句
String key = loadConvert(lr.lineBuf, 0, keyLen, convtBuf);
String value = loadConvert(lr.lineBuf, valueStart, limit - valueStart, convtBuf);
}
// ...
}
// Properties 有一个内部类 LineReader
class LineReader{
char[] lineBuf = new char[1024];
InputStream inStream;
// 其他属性...
public LineReader(InputStream inStream) {
this.inStream = inStream;
inByteBuf = new byte[8192];
}
// 初始化的时候
int readLine() throws IOException {
// ...
char c = 0;
// ...
if (inStream != null) {
//The line below is equivalent to calling a
//ISO8859-1 decoder.
c = (char) (0xff & inByteBuf[inOff++]);
} else {
c = inCharBuf[inOff++];
}
// ...
lineBuf[len++] = c;
}
}
读取utf8编码文件的数据
// 直接转码拿
new String(properties.getProperty("name").getBytes("ISO8859-1"), "UTF-8")
总结
至此, 相信相关的properties乱码问题和idea如何配置的问题, 都应该心中大致有了一个了解, 最终, 如何选择, 还是在于个人如何决策.
我个人是这样思考的, 实际使用中, 使用中文作为参数的情况其实很少, 如果个别需要完全可以自己转ansii
编码, 但是注释就不一样了, 而且, 学习的过程中, 单独查看properties配置文件是常有的事, 因此, 我更喜欢使用 utf8
编码的配置文件, 即取消勾选idea的那处配置.
还是老话, 取舍看个人. 不强迫自己 标新立异, 也不强迫自己 随大流, 怎么舒服怎么来.
ps:
- csdn代码编写排版识别, 不太好使.
utf8
编码这么好使, 为什么不统一 一下