Java处理UTF-8文件的BOM头部 - CSDN博客

文章推薦指數: 80 %
投票人數:10人

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; } } 上面的代码需要一个依赖: commons-codec commons-codec 1.14 移除UTF-8文件的BOM头部 通常,我建议不要用这个BOM,不然处理不好产生什么乱码就麻烦了。

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集合中 publicListfileContentList(StringfilePath){ L Java处理带BOM的文本 victoryckl的专栏 11-09 1380 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。

否则将追究法律责任。

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币套餐、付费专栏及课程。

余额充值



請為這篇文章評分?