Java处理UTF-8文件的BOM头部 - CSDN博客
文章推薦指數: 80 %
Java处理UTF-8文件的BOM头部BOM——Byte Order Mark,就是字节序标记。
基本概念在UCS 编码中有一个叫做”ZERO WIDTH NO-BREAK SPACE“的字符,它的编码 ...
Java处理UTF-8文件的BOM头部
快乐领读
于 2021-04-1721:33:37 发布
461
收藏
分类专栏:
JAVA
文章标签:
java
乱码
版权声明:本文为博主原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/billyge/article/details/115802242
版权
JAVA
专栏收录该内容
3篇文章
0订阅
订阅专栏
Java处理UTF-8文件的BOM头部
BOM——ByteOrderMark,就是字节序标记。
基本概念
在UCS编码中有一个叫做”ZEROWIDTHNO-BREAKSPACE“的字符,它的编码是FEFF。
而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。
UCS规范建议我们在传输字节流前,先传输字符”ZEROWIDTHNO-BREAKSPACE“。
如果接收者收到FEFF,就表明这个字节流是大字节序的;如果收到FFFE,就表明这个字节流是小字节序的。
因此字符”ZEROWIDTHNO-BREAKSPACE“又被称作BOM。
UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。
字符”ZEROWIDTHNO-BREAKSPACE“的UTF-8编码是EFBBBF。
所以如果接收者收到以EFBBBF开头的字节流,就知道这是UTF-8编码了。
这个BOM头部对于UTF-8来说不是必须的,并且我建议最好不用有这个头部,以避免可能的兼容性问题。
下面就来看看怎么用java来处理UTF-8的BOM头部
增加BOM到UTF-8文件
importjava.io.BufferedWriter;
importjava.io.IOException;
importjava.nio.file.Files;
importjava.nio.file.Path;
importjava.nio.file.Paths;
publicclassAddBomToUtf8File{
publicstaticvoidmain(String[]args)throwsIOException{
Pathpath=Paths.get("/home/file.txt");
writeBomFile(path,"billy");
}
privatestaticvoidwriteBomFile(Pathpath,Stringcontent){
//Java8defaultUTF-8
try(BufferedWriterbw=Files.newBufferedWriter(path)){
bw.write("\ufeff");
bw.write(content);
bw.newLine();
bw.write(content);
}catch(IOExceptione){
e.printStackTrace();
}
}
}
在Java8之前可以用下面的方法:
newOutputStreamWriter(
newFileOutputStream(path.toFile())
,StandardCharsets.UTF_8))){
bw.write("\ufeff");
bw.write(content);
bw.newLine();
bw.write(content);
}catch(IOExceptione){
e.printStackTrace();
}
}
或者可以用PrintWriter和OutputStreamWriter
try(PrintWriterpw=newPrintWriter(
newOutputStreamWriter(
newFileOutputStream(path.toFile()),StandardCharsets.UTF_8))){
//pw.write("\ufeff");
pw.write(0xfeff);//alternative,codepoint
pw.write(content);
pw.write(System.lineSeparator());
pw.write(content);
}catch(IOExceptione){
e.printStackTrace();
}
}
又或者,这样:
privatestaticvoidwriteBomFile4(Pathpath,Stringcontent){
try(FileOutputStreamfos=newFileOutputStream(path.toFile())){
byte[]BOM={(byte)0xEF,(byte)0xBB,(byte)0xBF};
fos.write(BOM);
fos.write(content.getBytes(StandardCharsets.UTF_8));
fos.write(System.lineSeparator().getBytes(StandardCharsets.UTF_8));
fos.write(content.getBytes(StandardCharsets.UTF_8));
}catch(IOExceptione){
e.printStackTrace();
}
}
检查文件是否包含BOM头部
importjava.io.IOException;
importjava.io.InputStream;
importjava.nio.file.Files;
importjava.nio.file.Path;
importjava.nio.file.Paths;
publicclassCheckBom{
publicstaticvoidmain(String[]args)throwsIOException{
Pathpath=Paths.get("/home/file.txt");
if(isContainBOM(path)){
System.out.println("FoundBOM!");
}else{
System.out.println("NoBOM.");
}
}
privatestaticbooleanisContainBOM(Pathpath)throwsIOException{
if(Files.notExists(path)){
thrownewIllegalArgumentException("Path:"+path+"doesnotexists!");
}
booleanresult=false;
byte[]bom=newbyte[3];
try(InputStreamis=newFileInputStream(path.toFile())){
//readfirst3bytesofafile.
is.read(bom);
//BOMencodedasefbbbf
Stringcontent=newString(Hex.encodeHex(bom));
if("efbbbf".equalsIgnoreCase(content)){
result=true;
}
}
returnresult;
}
}
上面的代码需要一个依赖:
importorg.apache.commons.codec.binary.Hex;
importjava.io.BufferedWriter;
importjava.io.FileInputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.nio.ByteBuffer;
importjava.nio.file.Files;
importjava.nio.file.Path;
importjava.nio.file.Paths;
publicclassRemoveBomFromUtf8File{
publicstaticvoidmain(String[]args)throwsIOException{
Pathpath=Paths.get("/home/file.txt");
writeBomFile(path,"billy");
removeBom(path);
}
privatestaticvoidwriteBomFile(Pathpath,Stringcontent){
//Java8defaultUTF-8
try(BufferedWriterbw=Files.newBufferedWriter(path)){
bw.write("\ufeff");
bw.write(content);
bw.newLine();
bw.write(content);
}catch(IOExceptione){
e.printStackTrace();
}
}
privatestaticbooleanisContainBOM(Pathpath)throwsIOException{
if(Files.notExists(path)){
thrownewIllegalArgumentException("Path:"+path+"doesnotexists!");
}
booleanresult=false;
byte[]bom=newbyte[3];
try(InputStreamis=newFileInputStream(path.toFile())){
//read3bytesofafile.
is.read(bom);
//BOMencodedasefbbbf
Stringcontent=newString(Hex.encodeHex(bom));
if("efbbbf".equalsIgnoreCase(content)){
result=true;
}
}
returnresult;
}
privatestaticvoidremoveBom(Pathpath)throwsIOException{
if(isContainBOM(path)){
byte[]bytes=Files.readAllBytes(path);
ByteBufferbb=ByteBuffer.wrap(bytes);
System.out.println("FoundBOM!");
byte[]bom=newbyte[3];
//getthefirst3bytes
bb.get(bom,0,bom.length);
//remaining
byte[]contentAfterFirst3Bytes=newbyte[bytes.length-3];
bb.get(contentAfterFirst3Bytes,0,contentAfterFirst3Bytes.length);
System.out.println("Removethefirst3bytes,andoverwritethefile!");
//overridethesamepath
Files.write(path,contentAfterFirst3Bytes);
}else{
System.out.println("Thisfiledoesn'tcontainsUTF-8BOM!");
}
}
}
复制UTF-8文件并追加BOM
importjava.io.IOException;
importjava.nio.file.Files;
importjava.nio.file.Path;
importjava.nio.file.Paths;
publicclassCopyAndAddBomToXmlFile{
publicstaticvoidmain(String[]args){
Pathsrc=Paths.get("src/main/resources/staff.xml");
Pathdest=Paths.get("src/main/resources/staff-bom.xml");
writeBomFile(src,dest);
}
privatestaticvoidwriteBomFile(Pathsrc,Pathdest){
try(FileOutputStreamfos=newFileOutputStream(dest.toFile())){
byte[]BOM={(byte)0xEF,(byte)0xBB,(byte)0xBF};
//addBOM
fos.write(BOM);
//BOM+srctofos
Files.copy(src,fos);
}catch(IOExceptione){
e.printStackTrace();
}
}
}
{
byte[]BOM={(byte)0xEF,(byte)0xBB,(byte)0xBF};
//addBOM
fos.write(BOM);
//BOM+srctofos
Files.copy(src,fos);
}catch(IOExceptione){
e.printStackTrace();
}
}
}
####
快乐领读
关注
关注
0
点赞
踩
0
收藏
打赏
1
评论
Java处理UTF-8文件的BOM头部
Java处理UTF-8文件的BOM头部BOM——ByteOrderMark,就是字节序标记。
基本概念在UCS编码中有一个叫做”ZEROWIDTHNO-BREAKSPACE“的字符,它的编码是FEFF。
而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。
UCS规范建议我们在传输字节流前,先传输字符”ZEROWIDTHNO-BREAKSPACE“。
如果接收者收到FEFF,就表明这个字节流是大字节序的;如果收到FFFE,就表明这个字节流是小字节序的。
因此字符”ZERO
复制链接
扫一扫
专栏目录
[java]处理utf-8bom字符串的bom头
知识共享,快乐分享
03-22
5527
char[]bomChar="带bom的字符串".toCharArray();//转为char数组
char[]noneBomchar=newchar[bomChar.length-1];//数组第一个元素是bom头,去掉它
for(intj=0;j<noneBomchar.length;j++){
noneBomchar[j]=bomChar[j...
javautf8bom_Java读带有BOM的UTF-8文件乱码原因及解决方法
weixin_42415451的博客
02-12
345
转自:http://daimojingdeyu.iteye.com/blog/397661最近在处理文件时发现了同样类型的文件使用的编码可能是不同的。
所以想将文件的格式统一一下(因为UTF-8的通用性,决定往UTF-8统一),遇见的第一个问题是:如何查看现有文件的编码方式。
上网找了一下,找到几篇比较好文章,这里就不转载啦把链接搞过来。
文件编码问题集锦字符串编码(charset,encoding,d...
评论 1
您还未登录,请先
登录
后发表或查看评论
读取xml格式utf-8编码和utf-8无bom编码格式,出现前言中不允许有内容的问题
yong_wuqing的专栏
01-02
4081
1,java读取xmlutf-8编码格式的文件,出现 Causedby:org.xml.sax.SAXParseException;lineNumber:1;columnNumber:1;前言中不允许有内容。
出现这样的原因,是因为读取文件过程中,出现了格式转化问题,在代码中,需要进行转化处理.对utf-8编码格式或者utf-8无bom编码格式,要有对应的读
Java解决UTF-8的BOM问题
十六月的博客
03-18
9057
近日在项目中遇到一件诡异的事情,有一个txt文件,用记事本保存和notepad++保存,再用Java读取的时候,读出来的结果不一致。
如上面这个txt文件,读取“自杀”2个字,虽然打印在控制台都是一样的,但是进行长度比对发现notepad++长度是2,但是记事本保存后读出来的长度竟然是3。
后面在网上查询了一下,txt文件编码格式有UTF-8和UTF-8无(BOM)2中格式,下面来看
bomcsvjava_Java处理文件BOM头的方式推荐
weixin_39697096的博客
12-19
87
背景:java普通的文件读取方式对于bom是无法正常识别的。
使用普通的InputStreamReader,如果采用的编码正确,那么可以获得正确的字符,但bom仍然附带在结果中,很容易导致数据处理出错。
另外,对于存在BOM头的文件,无法猜测它使用的编码。
目标:实现一种方式,可对BOM头进行捕捉和过滤解决方案有二:一、使用apache的工具类,以BOMStream为例:该类的构造方式:BOMInp...
java过滤bom头_去除bom头.java
weixin_42360993的博客
02-13
1227
去除bom头.javapackagecom.test;importjava.io.File;importjava.io.IOException;importjava.util.Collection;importorg.apache.commons.io.DirectoryWalker;importorg.apache.commons.io.FileUtils;importorg.ap...
java文件bom头问题,去掉utf-8的Bom头:使用java以及jdbc不使用第三方库执行sql文件脚本...
weixin_34663092的博客
03-12
131
packagecom.xxx.xxx.dao;importjava.io.BufferedReader;importjava.io.File;importjava.io.FileInputStream;importjava.io.InputStreamReader;importjava.io.UnsupportedEncodingException;importjava.sql.Co...
java中utf-8含义,除开java代码中的UTF-8BOM标识(转)
weixin_34524593的博客
03-21
200
去除java代码中的UTF-8BOM标识(转)(原作者地址)http://hi.baidu.com/893625/blog/item/c5dbf9d158080c359b502715.htmlimportjava.io.BufferedReader;importjava.io.ByteArrayOutputStream;importjava.io.File;importjava.io.F...
java获取xml内容去掉BOM头_如何从Java中的XML文件中删除BOM
weixin_26841743的博客
02-28
691
因为UTF-8文件中的BOM而破坏工具是我经验中很常见的事情。
我不知道为什么那里有如此多的downvote(但是这让我有机会尝试获得足够的投票赢得一个特殊的SO徽章);更重要的是:UTF-8BOM通常没有什么意义,但它完全有效(尽管不鼓励)规格。
现在的问题是很多人都不知道BOM在UTF-8中有效,因此编写了不能正确处理这些文件的破坏的工具/API。
现在您可能会遇到两个不同的问题:您可能希望从J...
前言中不允许有内容JAVA解析xml文件时去掉bom头的方法
123
09-11
3007
最近项目有了新需求,需要把指定目录下的xml文件解析成JSON字符串并存储到mongoDB中。
我使用了org.dom4j的解析方法,在运行时发现报错:前言中不允许有内容。
百度后得知是因为文件带bom头,解析的时候就会报错,需要去掉bom头。
结果网上的方法让人啼笑皆非,用EditPuls来转换成无bom编码。
我就纳闷了,难道项目运行时,还要人工一个个的去这样操作吗?肯定不行,得用java的方式去自动...
java判断无bom,UTF-8文件BOM自动检测移除程序-Java架构师必看
weixin_30604459的博客
03-09
200
BOM信息是文件开头的一串隐藏的字符,用于让某些编辑器识别这是个UTF-8编码的文件。
但PHP在读取文件时会把这些字符读出,从而形成了文件开头含有一些无法识别的字符的问题。
比如用UTF-8格式保存的生成图片的PHP文件,因为文件头隐藏的BOM信息也被下发,导致生成的图片数据不对,浏览器无法识别。
要检测一个UTF-8文件是否含有BOM信息,就是检测文件开头的字三个符,是否为0xEF,0xBB,...
java读取包含[BOM]位的UTF-8文件
chengli0134的博客
09-05
41
最近在做一个数据共享的项目,在读取UTF-8编码的文件时出现些问题,现记录如下。
UTF-8编码的文件在读取时要格外注意,看其文件开头是否包含[BOM]位。
这个字符一般用来判断该文件是否为UTF-8编码,但Java读取时也会将该判断位一同读出,导致读取的数据与预期不一致。
解决方法如下
im...
java在处理文件时BOM头的坑
Howard_Stark的博客
09-06
340
最近项目中的需求是从一个文件中读取字符作为文件路径,再根据文件路径去读取指定文件的内容:
比如一个文件test.txt的内容是
wenjian1.txt
wenjian2.txt
wenjian3.txt
现在要根据test.txt的文件获取wenjian1.txt、wenjian2.txt、wenjian3.txt的文件名
//根据文件路径获取文件每一行的内容,存入list集合中
publicList
否则将追究法律责任。
http://lavasoft.blog.51cto.com/62575/331095
Java处理带BOM的文本
说起BOM,这个问题还比较麻烦,因为BOM不可见,但用程序做不同编码文本处理时候却常常需要考虑到BOM的问题。
在此之前,先对BOM做个简单认识。
先看看带BO
java输出utf8_JAVA输出带BOM的UTF-8编码的文件
weixin_30259017的博客
02-13
217
当从http的response输出CSV文件的时候,设置为utf8的时候默认是不带bom的,可是windows的Excel是使用bom来确认utf8编码的,全部须要把bom写到文件的开头。
微软在UTF-8中使用BOM是由于这样能够把UTF-8和ASCII等编码明白区分开。
否则用Excel打开CSV文件有可能是乱码的演示样例代码例如以下:response.setContentTyp...
Java-读取UTF-8-BOM文件,第一个字段值为Null
A_bad_horse的专栏
03-25
165
问题复现
Phone.java
@Data
@NoArgsConstructor
@AllArgsConstructor
publicclassPhone{
privateStringbrand;
privateStringtype;
}
PhoneTest.java
importcn.hutool.core.io.IORuntimeException;
importcn.hutool.core.io.file.FileReader;
importcom.al
Java读带有BOM的UTF-8文件乱码原因及解决方法
最新发布
kodmoqn的博客
05-31
84
Java读带有BOM的UTF-8文件乱码原因及解决方法
java导入百万csv_关于java导入导出CSV文件的坑
weixin_35645652的博客
03-02
412
现在越来越多与数据相关的项目用到数据的批量导入导出功能,csv格式文件也是这种场景下最常用的文件格式。
csv可以用excel打开,这也是他便利的一面,相比于xlsx等格式,csv格式更简单,只包含数据,不包含格式,体积更小,兼容性更好。
但其中也隐藏着一些坑。
我们一般常用的编码格式是UTF-8,其实有utf-8和utf-8bom两种格式,utf-8bom格式是在文件开头加了0xEF,0xBB,...
java写utf-8有bom_Java读带有BOM的UTF-8文件乱码
weixin_36269733的博客
02-13
248
通过java写的UTF-8文件,使用Java可以正确的读,但是如果用记事本将相同的内容使用UTF-8格式保存,则在使用程序读取是会从文件中多读出一个不可见字符,多一个?实例:新建一个文本:内容为“测试BOM”的txt文本,另存为UTF-8.处理带BOM的类UnicodeReaderpackagecom.java.io;importjava.io.IOException;importjava....
Java处理文件BOM头的方式推荐
热门推荐
美码师的专栏
11-07
1万+
背景:
java普通的文件读取方式对于bom是无法正常识别的。
使用普通的InputStreamReader,如果采用的编码正确,那么可以获得正确的字符,但bom仍然附带在结果中,很容易导致数据处理出错。
另外,对于存在BOM头的文件,无法猜测它使用的编码。
目标:
实现一种方式,可对BOM头进行捕捉和过滤
解决方案有二:
一、 使用apache的工具类,以BOM
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022CSDN
皮肤主题:大白
设计师:CSDN官方博客
返回首页
快乐领读
CSDN认证博客专家
CSDN认证企业博客
码龄18年
暂无认证
12
原创
31万+
周排名
133万+
总排名
2万+
访问
等级
558
积分
5
粉丝
0
获赞
1
评论
0
收藏
私信
关注
热门文章
java性能分析
1146
数据库一览
980
调试JavaWebStart
799
让powerdesigner生成的sql在mysql下正确运行
771
ecshop和jquery冲突解决方案
710
分类专栏
领读
图解性能优化
人工智能
DEDECMS
1篇
JAVA
3篇
Wordpress
其他
4篇
最新评论
Java处理UTF-8文件的BOM头部
lengG12:
牛逼,亲测能用
Java处理UTF-8文件的BOM头部
不正经的kimol君:
厉害,赞一个,欢迎回赞哦~
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
java性能分析
CSShack:区分IE6,IE7,firefox
开发者不可不知的PHP框架深度解析
2021年1篇
2010年11篇
目录
目录
分类专栏
领读
图解性能优化
人工智能
DEDECMS
1篇
JAVA
3篇
Wordpress
其他
4篇
目录
评论 1
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
打赏作者
快乐领读
你的鼓励将是我创作的最大动力
¥2
¥4
¥6
¥10
¥20
输入1-500的整数
余额支付
(余额:--)
扫码支付
扫码支付:¥2
获取中
扫码支付
您的余额不足,请更换扫码支付或充值
打赏作者
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
0
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值
延伸文章資訊
- 1Java Convert a File's Character Encoding from UTF-8 to UFT ...
To add a utf-8 BOM to a file is just a matter of prepending these 3 bytes to the file: 0xEF 0xBB ...
- 2Java处理UTF-8文件的BOM头部 - CSDN博客
Java处理UTF-8文件的BOM头部BOM——Byte Order Mark,就是字节序标记。基本概念在UCS 编码中有一个叫做”ZERO WIDTH NO-BREAK SPACE“的字符,它...
- 3Java - 读取UTF-8-BOM文件,第一个字段值为Null - CSDN博客
2. 从xls中copy数据到phone.txt中,此时phone.txt默认格式为UTF-8-BOM。 3. 查看文本编码格式,用nodepad打开文件,Encoding 即可查看文本编码格式...
- 4Java处理UTF-8文件的BOM头部 - 51CTO博客
Java处理UTF-8文件的BOM头部. BOM——Byte Order Mark,就是字节序标记。 基本概念. 在 UCS 编码 中有一个叫做” ZERO WIDTH NO-BREAK SPA...
- 5Java處理UTF-8帶BOM的文本的讀寫 - 網頁設計教學
BOM(byte-order mark),即字節順序標記,它是插入到以UTF-8、UTF16或UTF-32編碼Unicode文件開頭的特殊標記,用來識別Unicode文件的編碼類型。