Java配置文件Unicode编码可能引发的bug
2017-07-10 14:12
253 查看
搬迁博客[2015-05-26] http://xiaosunzhu.iteye.com/blog/2214416
发现bug:
在服务器上部署后台服务并验证能够正常运行,但是一次修改配置重启后突然出现了一个空指针bug,部署的程序并没有改变
定位bug:
空指针定位到一个变量,查找代码发现变量初始化来自于读取配置文件,但是检查配置文件中有正常配置相应值,所以无法找到原因。
后来在开发机器上调试服务都没有问题,只好重新部署服务到服务器,发现是能够正常运行。
比较两次部署的服务包,内容完全一致,唯独配置文件的二进制不同,使用十六进制查看配置文件,发现文件开头多出了3个字节的BOM头。
解决bug:
使用文本编辑工具将配置文件的BOM头去掉后,重新启动服务,验证能够正常运行。
分析bug:
Bug产生的原因:Windows系统对Unicode编码的文本文件会使用BOM头来定义编码方式和字节序,如果使用记事本编辑Unicode文件保存后就会默认添加BOM头。而Java的原生IO并不会处理BOM头,会将BOM头视为普通内容,JDK Bug中有此记录,详见JDK Bug 4508058,结论是该Bug不会修复,为了更好的适应性。
Bug的避免:
建议不使用Unicode编码的配置文件,有些IDE默认都是ISO8859-1,这样兼容性最好。
在Windows系统上编辑文本文件需要使用编辑工具,不要默认使用记事本,编辑要注意BOM头问题。
为使程序兼容性更好,读取文件时程序应识别并去掉BOM头。已提供读取配置文件工具,源码详见UnicodeInputStream。
下载resource-utils库或者可以引入maven依赖库
使用该工具库读取配置可以兼容BOM头。具体用法详见README。
附BOM头规则:
00 00 FE FF = UTF-32, big-endian
FF FE 00 00 = UTF-32, little-endian
EF BB BF = UTF-8,
FE FF = UTF-16, big-endian
FF FE = UTF-16, little-endian
发现bug:
在服务器上部署后台服务并验证能够正常运行,但是一次修改配置重启后突然出现了一个空指针bug,部署的程序并没有改变
定位bug:
空指针定位到一个变量,查找代码发现变量初始化来自于读取配置文件,但是检查配置文件中有正常配置相应值,所以无法找到原因。
后来在开发机器上调试服务都没有问题,只好重新部署服务到服务器,发现是能够正常运行。
比较两次部署的服务包,内容完全一致,唯独配置文件的二进制不同,使用十六进制查看配置文件,发现文件开头多出了3个字节的BOM头。
解决bug:
使用文本编辑工具将配置文件的BOM头去掉后,重新启动服务,验证能够正常运行。
分析bug:
Bug产生的原因:Windows系统对Unicode编码的文本文件会使用BOM头来定义编码方式和字节序,如果使用记事本编辑Unicode文件保存后就会默认添加BOM头。而Java的原生IO并不会处理BOM头,会将BOM头视为普通内容,JDK Bug中有此记录,详见JDK Bug 4508058,结论是该Bug不会修复,为了更好的适应性。
Bug的避免:
建议不使用Unicode编码的配置文件,有些IDE默认都是ISO8859-1,这样兼容性最好。
在Windows系统上编辑文本文件需要使用编辑工具,不要默认使用记事本,编辑要注意BOM头问题。
为使程序兼容性更好,读取文件时程序应识别并去掉BOM头。已提供读取配置文件工具,源码详见UnicodeInputStream。
下载resource-utils库或者可以引入maven依赖库
<groupId>net.sunyijun</groupId> <artifactId>resource-utils</artifactId>
使用该工具库读取配置可以兼容BOM头。具体用法详见README。
附BOM头规则:
00 00 FE FF = UTF-32, big-endian
FF FE 00 00 = UTF-32, little-endian
EF BB BF = UTF-8,
FE FF = UTF-16, big-endian
FF FE = UTF-16, little-endian
相关文章推荐
- java输出txt文件为unicode的编码方式
- 配置文件出现BOM头(文件编码改变)引发的问题
- 对java unicode编码以及读写文件编码的理解
- java生成unicode编码格式的txt文件
- Java工程Properties配置文件注释中文,会自动转换为其他编码方式问题解决
- java xx.properties文件中汉字UNICODE编码的正则表达式转换为汉字
- Java 过滤器读取配置文件实现过滤编码
- java之配置文件中的汉字和unicode相互转换
- 监听器配置文件web.xml引发java.lang.ClassNotFoundException
- 一上午搞java编码问题,写了一个将批量文件编码转为UTF-8的小程序(有BUG-.-!)
- [编辑][Java]删除properties配置文件中键值对的方法、附带字符串和Unicode间的转换方法
- python对配置文件对中文转换Unicode编码
- java中国际化properties的Unicode编码文件用命令转化为中文文件
- JAVA:配置文件读取器
- JOPL的配置文件Bug
- 谈Java Properties配置文件, 是J2EE容器的命令行绑定, 还是使用Deploy自适应的绑定?
- Java font.properties 配置文件(中文/翻译中。。。)
- 流媒体学习笔记----用配置好的文件进行编码
- 用java读取解析一个含有变量的配置文件
- 用java读写ini配置文件的原因以及实现 示例