各位看标题就知道我要写什么了,先写结论,读取utf-8格式的文件时候,注意文件开头可能含有BOM标识符,结论写完了,下面的没必要看了,我记录下问题解决方法而已。
虽然早知道utf-8文件可能含有bom标识符,我一直没碰到过,知道今天,我测试时候发现字符串长度不对劲,如下所示:
长度不对劲,我就开始怀疑我碰上了传说中的BOM标识符了,下面可是验证,上代码:
public class UTFBOM文件处理 { public static void main(String[] args) throws Exception { List<String> resultList = readFileByLine("f:/saveFile/temp/name2.txt"); String tmpStr = resultList.get(0); System.out.println(tmpStr + "----len=" + tmpStr.length()); String tmpStr2 = new String(tmpStr.substring(0, 1)); System.out.println(tmpStr2 + "----hex=" + strtoHex(tmpStr2)); } public static String strtoHex(String s) { String str = ""; for (int i = 0; i < s.length(); i++) { int ch = (int) s.charAt(i); String s4 = Integer.toHexString(ch); str = str + s4; } return "0x" + str;// 0x表示十六进制 } public static List<String> readFileByLine(String filename) throws Exception { List<String> nameList = new ArrayList<String>(); File file = new File(filename); InputStreamReader isr = new InputStreamReader( new FileInputStream(file), "UTF-8"); BufferedReader reader = new BufferedReader(isr); String tmp = reader.readLine(); while (tmp != null && tmp.trim().length() > 0) { nameList.add(tmp); tmp = reader.readLine(); } reader.close(); return nameList; } }
结果为:
掬水月在手----len=6 ----hex=0xfeff
看到好熟悉的feff。
使用16进制打开文件,可以看到BOM标识符了。
BOM是什么,可以参考链接:
http://mindprod.com/jgloss/bom.html
ef bb bf
写道
UTF-8 endian, strictly speaking does not apply, though it uses big-endian most-significant-bytes first representation.
解决方法:
http://koti.mbnet.fi/akini/java/unicodereader/
public static List<String> readFileByLineWithOutBom(String filename) throws Exception { List<String> nameList = new ArrayList<String>(); File file = new File(filename); InputStream in = new FileInputStream(file); BufferedReader reader = new BufferedReader(new UnicodeReader(in, "utf-8")); String tmp = reader.readLine(); while (tmp != null && tmp.trim().length() > 0) { nameList.add(tmp); tmp = reader.readLine(); } reader.close(); return nameList; }
带BOM标识符的文件怎么产生的呢?
系统默认另存为utf-8保存的就是带bom的,以前一直用nodepad++另存为的,今天犯二了,忘了。
全文完。
相关推荐
Java解决UTF-8的BOM问题,使用“UnicodeInputStream”、“UnicodeReader”。
NULL 博文链接:https://baobeituping.iteye.com/blog/1280825
解决PB创建UTF-8文件带BOM问题; 2.字段串直接生成XML文件。 由于项目需要,需要字符串转为XML文件,直接用Fileopen进行EncodingUTF8编码后,发现文件实际为UTF-8 BOM编码 问度娘发现有相同问题,但解决方式是利用...
delphi保存读取utf-8的文本文件.mht
VBA Fans读取和写入UTF-8格式文本文件
读取ANSI 明码文件 读取Unicode 明码文件 读取Unicode big endian 明码文件 读取UTF-8 明码文件 读取UTF8 Bom 明码文件 读取UTF16-LE 明码文件 读取UTF16-BE 明码文件 到多字节字符串 扩展类CFilePlainCode
把含有本地编码的文件转成utf-8的,经常用于java文件的转码. 把编码gbk的java文件批量转成utf-8编码的文件.
pb12 gb转utf-8
PB的utf-8转换,包括加码解码等等 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
delphi 6-XE读取ANSI,unicode,unicode big,utf-8,utf-8BOM文件,保存utf8
易语言另类数据库读写UTF-8源码,另类数据库读写UTF-8
Python 简单使用 pandas 读取excel 的 csv文件处理,支持utf-8和gbk编码自动识别。
本文实例讲述了Python3读取UTF-8文件及统计文件行数的方法。分享给大家供大家参考。具体实现方法如下: ''''' Created on Dec 21, 2012 Python 读取UTF-8文件 统计文件的行数目 @author: liury_lab ''' # -*- ...
非常实用的读取配置文件的小工具,专门读取WEB-INF下文件夹中的properties文件,代码简洁、亲测没有问题,适用范围广,任何类中都可调用,传入Key及可得到Value
批量将任何编码格式的文件转换成UTF-8编码的文件,将工具放到需要转换的文件路径,双击运行,即可批量将路径下的所有文件(包含子文件夹中文件)转换成UTF-8编码的文件, 注意:不要在文件夹下放入无法读取的文件...
如何解决BOM:先放在服务器可执行目录下,使用 浏览器http://服务器ip/存放路径/bom.php来 访问,填写实际路径执行后可得到存在有BOM的PHP文件,然后再用notepad++打开,在菜单选“格式”->“转为UTF-8无BOM..”即可. ...
很多人喜欢用CString 或std:string,但是他们的缺点是不能完成汉字各种类型之间的转换,提供三种类库ascString,ucsString,utfString以及工具utfCount,utf8_ucs2_t,tcf8_ucs4_t类库,用于各种字符串之间的直接转换`...
身份证读卡器生成的基本信息TEXT文件,由于是采用 GB 13000 的 UCS-2 编码格式,java读取出来是乱码,这个段代码就是解决转码问题的,亲测可用
Delphi读写UTF-8、Unicode格式文本文件 .mht
UTF-8 BOM(字节顺序标记)条介绍Bomstrip 是一个非常简单的工具,它从标准输入 (stdin) 读取 UTF-8 文本,删除 BOM(字节顺序标记),然后写入标准输出 (stdout)。 这个工具是用 C 写的。如果你没有 C 编译器,或者...