Java读取Unicode文件(UTF-8等)时碰到的BOM首字符问题,及处理方法
来源:互联网 发布:免费电子相册制作软件 编辑:程序博客网 时间:2024/05/01 19:44
在Windows下用文本编辑器创建的文本文件,如果选择以UTF-8等Unicode格式保存,会在文件头(第一个字符)加入一个BOM标识。
这个标识在Java读取文件的时候,不会被去掉,而且String.trim()也无法删除。如果用readLine()读取第一行存进String里面,这个String的length会比看到的大1,而且第一个字符就是这个BOM。
这种情况会造成一些麻烦,比如在读取ini文件的时候,如果想判断第一行是不是以“[”开头就无法正确判断。
幸好,Java在读取Unicode文件的时候,会统一把BOM变成“\uFEFF”,这样的话,就可以自己手动解决了(判断后,用substring()或replace()去除掉这个BOM):
if(line.startsWith("\uFEFF")){ //line = line.substring(1); line = line.replace("\uFEFF", ""); }
然而,这种方法并不是完美的,如果生成jar文件在windows下运行,还是有问题。终极的解决方法是使用apache commons io提供的BOMInputStream:
<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency>
BufferedReader reader = null; try { //reader = new BufferedReader(new FileReader(file)); //使用BOMInputStream自动去除UTF-8中的BOM!!! reader = new BufferedReader(new InputStreamReader(new BOMInputStream(new FileInputStream(file)))); String str = null; //一次读入一行(非空),直到读入null为文件结束 while ((str = reader.readLine()) != null) { }
什么是BOM?
BOM = Byte Order Mark
BOM是Unicode规范中推荐的标记字节顺序的方法。比如说对于UTF-16,如果接收者收到的BOM是FEFF,表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。
UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明“我是UTF-8编码”。BOM的UTF-8编码是EF BB BF(用UltraEdit打开文本、切换到16进制可以看到)。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。
所有的BOM在C/C++/Java中都被处理为”\uFEFF”(???貌似不一定。。。),参考:http://www.fileformat.info/info/unicode/char/feff/index.htm
Wikipedia关于POM的说明介绍:
https://en.wikipedia.org/wiki/Byte_order_mark
引用至 http://blog.csdn.net/clementad/article/details/47168573
- Java读取Unicode文件(UTF-8等)时碰到的BOM首字符问题,及处理方法
- Java读取Unicode文件(UTF-8等)时碰到的BOM首字符问题,及处理方法
- Java读取Unicode文件(UTF-8等)时碰到的BOM首字符问题,及处理方法
- Java读取Unicode文件(UTF-8等)时碰到的BOM首字符问题,及处理方法
- python处理文件首行读取问题 utf-8 BOM
- Java对UTF-8格式文件的读取、写入及添加BOM头处理
- Java读取带有BOM的UTF-8文件乱码原因及解决办法
- UTF-8文件头BOM的处理方法
- java utf-8文件处理bom头
- 读取文本出现 锘 * 系列乱码错误(UTF-8 BOM问题)的原因及解决方法
- Java读取UTF-8格式txt文件第一行出现乱码——问号“?”及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法
- Java读取UTF-8格式txt文件第一行出现乱码——问号“?”及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法
- Java读取UTF-8格式txt文件第一行出现乱码——问号“?”及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法
- Java读取UTF-8格式txt文件第一行出现乱码——问号“?”及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法
- Java读取UTF-8格式txt文件第一行出现乱码——问号“?”及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法
- Java读取UTF-8格式txt文件第一行出现乱码——问号“?”及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法
- Java读取UTF-8格式txt文件第一行出现乱码——问号“?”及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法
- Java读取UTF-8格式txt文件第一行出现乱码——问号“?”及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法
- itext导出报表防止内存溢出
- Ceph 入门——内部构件
- base64初探
- C++学习笔记--字符串类
- Spring使用BeanName视图产生Excel视图
- Java读取Unicode文件(UTF-8等)时碰到的BOM首字符问题,及处理方法
- STM32 F103 NandFlash的配置使用
- RabbitMQ基础概念详细介绍
- 国内优质原创内容输出平台
- HttpContext, HttpRequest, HttpResponse 常用对象摘要
- linux系统资源查看
- _getch与getchar函数的区别
- ubuntu 16.04 启用root用户方法
- 9章 虚拟存储器