关于UTF8文件带BOM头可能会引起的错误解析
今天在做一个文件上传的项目中碰到了一个十分奇怪的问题,在解析上传上来的csv文件时,总是在解析第一行的第一个标题字段时出错,就是第一个那个字段总是和对应的model字段对应不上,这个坑是真的很深,找了半天,发现原来utf8编码格式的文件可能会有BOM头这玩意儿!
我们先来看看什么是BOM头:
在utf-8编码文件中BOM在文件头部,占用三个字节,用来标示该文件属于utf-8编码。
现在已经有很多软件识别bom头,但是还有些不能识别bom头,比如PHP就不能识别bom头,这也是用记事本编辑utf-8编码后执行就会出错的原因了。
最坑的是这个bom头在记事本中是完全看不见的,当记事本指定的编码格式是默认的ANSI编码时,文件的内容解析是没有任何问题的。但是,这样会出现中文乱码的情况,一般在项目中都会统一使用utf8编码,在我在记事本中指定了utf8编码格式上传后,才出现了字段解析不正确的情况。
那么怎么处理掉这个BOM头呢,在java中apache提供了一个工具类BOMStream,在获取文件流时,将获取到的文件流转化成为BOM流:
InputStreamReader isr = new InputStreamReader (new BOMInputStream (fileInputStream), "utf8");
这样以来,读取的文件中即使有BOM头,也会被自动过滤掉。但是这种方法只能过滤掉UTF-8/UTF-16LE/UTF-16BE三种编码格式的文件,当文件是其他格式时,就会失效。
要想支持更多的编码格式的文件,只能使用另外一个工具了:UnicodeStream和UnicodeReader,其使用示例如下:
1 FileInputStream fis = new FileInputStream(file);
2 UnicodeReader ur = new UnicodeReader(fis, "utf-8");
3 BufferedReader br = new BufferedReader(ur);
这种方式更加的通用与强大。推荐使用这种方法。
关于UTF8文件带BOM头可能会引起的错误解析的更多相关文章
- UTF8文件带BOM引起的问题
起因是公司iOS端竟然加载除了HTML代码,百思不得其解,查文献,原来如此... UTF-8 不需要 BOM,尽管 Unicode 标准允许在 UTF-8 中使用 BOM.所以不含 BOM 的 UTF ...
- C# UTF-8文件带BOM和不带BOM文件的转换
读取INI文件使用的是GetPrivateProfileString方法,自己读写ini文件没有问题. 调用C++的API对同一个ini文件进行处理后,发现首个Section的值读不出来:发现是API ...
- java utf-8文件处理bom头
UTF? UTF,是UnicodeTransformationFormat的缩写,意为Unicode转换格式. 即怎样将Unicode定义的数字转换成程序数据.utf是对Unicode的一种编码格式化 ...
- python 带BOM头utf-8的响应解码
接口响应编码格式为带BOM头utf-8.直接获取响应的text出现乱码. '''dinghanhua2018-11requests text与content,指定响应的encoding''' api ...
- 什么是文件的BOM头
1.什么是BOM? BOM是用来判断文本文件是哪一种Unicode编码的标记,其本身是一个Unicode字符("\uFEFF"),位于文本文件头部. 在不同的Unicode编码中, ...
- 什么是文件的BOM头,及BOM头有哪些坑?
1.什么是BOM? BOM是用来判断文本文件是哪一种Unicode编码的标记,其本身是一个Unicode字符("\uFEFF"),位于文本文件头部. 在不同的Unicode编码中, ...
- JSON字符串带BOM头"ufeff"
调用三方接口返回值JSON字符串带BOM头"\ufeff",JSON解析死活报错. 我是用SpringBoot的RestTemplate调用三方接口的,一开始返回值我是用对象接收返 ...
- 使用editplus等编程工具时UTF-8编码去掉BOM头方法(转载备查)
Unicode规范中有一个BOM的概念.BOM——Byte Order Mark,就是字节序标记.在这里找到一段关于BOM的说明: 在UCS 编码中有一个叫做"ZERO WI ...
- 批量去除文件的BOM头
<?php class KillBom{ //定义扩展名 public static $m_ext = ['txt','php','js','css']; /** * 传入一个任意文件,自动区分 ...
随机推荐
- Maven中settings.xml的配置项说明精讲
1.Maven的配置文件(Maven的安装目录/conf/settings.xml ) 和 Maven仓库下(默认的Maven仓库的是用户家目录下的.m2文件,可以另行制定)的settings.xml ...
- 数组去重+indexOf()应用
说起数组去重大家都不陌生,去重也有好多种方法,这里介绍很好理解的两种. 第一种 首先说一下第一种的逻辑,就是先拿第一个去跟第二个比,再跟第三个比,再跟第四个比--只要发现有相等的,可以用splice( ...
- linux操作系统基础篇(三)
1.cat命令 cat除了可以用来查看文本文档还可以将两个文本文档纵向合并到另外一个文本文档中 比如 cat /etc/passwd /etc/group > 1.txt 2. 归纳了所有的压缩 ...
- Android Debug Bridge
Android Debug Bridge Introduction Android Debug Bridge (adb) is a versatile command line tool th ...
- NULL字段对于UNIQUE INDEX失效
- Upgrading an ASP.NET MVC 2 Project to ASP.NET MVC 3 Tools Update
ASP.NET MVC 3 can be installed side by side with ASP.NET MVC 2 on the same computer, which gives you ...
- IDEA热部署(二)---jetty插件启动maven项目
jetty插件的配置 我们使用jetty插件来进行启动我们的maven项目,在pom.xml中进行配置: <plugins> <plugin> <groupId>o ...
- Next week plan
1.get a job 2.write a high performance chatroom with encryption. Use scala. Next Week turn to Rust
- (五)solr7.1.0之solrJ的使用
(五)solr7.1.0之solrJ的使用 下面是solr7的官网API介绍: 网页翻译的不是很准确,只能了解个大概,基本能获取如下信息: 一.构建和运行SolrJ应用程序 对于用Maven构建的项目 ...
- NETStandard,NETFx,Mono,NETCore,ASPNetCore 之间关系的整理
因为现在很多人对这几者之间的关系还不甚了解,这里根据我所知来做一个大概的介绍...... .NET Standard: .NET标准,只要符合这个标准实现类库,即可在支持此标准的Run ...