开门见山
出现的问题:从txt文件中取出数据存进数据库时,数据前多了个“?”
类似于上图第一行数据
之后发现是因为文件格式的问题,用了UTF-8带BOM的文件导致的;
解决办法:取数据时加一个对文件首个字符的判定,是utf-8带bom格式的文件就不取第一个字符即可,
实测问题已解决
if (params[0].substring(0,1).contains("\uFEFF")){//是utf-8带bom格式
certCode=params[0].substring(1);//若文件为utf-8-bom格式,不取第一位
}else {
certCode = params[0];//文件中第一列 证件号码
}
关于UTF-8和UTF-8带bom的区别.
什么是BOM?
BOM(byte-order mark),即字节顺序标记,它是插入到以UTF-8、UTF16或UTF-32编码Unicode文件开头的特殊标记,用来识别Unicode文件的编码类型。对于UTF-8来说,BOM并不是必须的,因为BOM是用来标记多字节编码文件的编码类型和字节顺序(big-endian或little- endian)。而UTF-8中,每个字符的编码有多少位是通过第一个字节来表述的,而且没有big-endian和little-endian的区分。
UTF-8 不需要 BOM,尽管 Unicode 标准允许在 UTF-8 中使用 BOM。所以不含 BOM 的 UTF-8 才是标准形式,在 UTF-8 文件中放置 BOM 主要是微软的习惯(顺便提一下:把带有 BOM 的小端序 UTF-16 称作「Unicode」而又不详细说明,这也是微软的习惯)。
BOM是为 UTF-16 和 UTF-32 准备的,用于标记字节序(byte order)。微软在 UTF-8 中使用 BOM 是因为这样可以把 UTF-8 和 ASCII 等编码明确区分开,否则用Excel打开CSV文件有可能是乱码的。但这样的文件在 Windows 之外的操作系统里会带来问题。
「UTF-8」和「带 BOM 的 UTF-8」的区别就是有没有 BOM。即文件开头有没有 U+FEFF。
UTF-8 的网页代码不应使用 BOM,否则常常会出错。当从http 的response输出CSV文件的时候,设置为utf8的时候默认是不带bom的,但是windows的Excel是使用bom来确认utf8编码的,所有需要把bom写到文件的开头。