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

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

Java处理UTF-8文件的BOM头部. BOM——Byte Order Mark,就是字节序标记。

基本概念. 在 UCS 编码 中有一个叫做” ZERO WIDTH NO-BREAK SPACE “的字符,它 ... Java处理UTF-8文件的BOM头部 关注 快乐领读 文章目录 Java处理UTF-8文件的BOM头部 增加BOM到UTF-8文件 检查文件是否包含BOM头部 移除UTF-8文件的BOM头部 复制UTF-8文件并追加BOM Java处理UTF-8文件的BOM头部 原创 快乐领读 2021-04-1721:39:55 ©著作权 文章标签 Java UTF-8 乱码 文章分类 Java 编程语言 ©著作权归作者所有:来自51CTO博客作者快乐领读的原创作品,请联系作者获取转载授权,否则将追究法律责任 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(); } } } 赞 收藏 评论 分享 举报 上一篇:我的《实战java高并发程序设计》纸质书上市了 下一篇:《图解性能优化》——折半查找 提问和评论都可以,用心的回复会被更多人看到 评论 发布评论 全部评论 (0) 最热 最新 相关文章 Java读带有BOM的UTF-8文件乱码 通过java写的UTF-8文件,使用Java可以正确的读,但是如果用记事本将相同的内容使用UTF-8格式保存,则在使用程序读取是会从文件中多读出一个不可见字符,多一个?实例:新建一个文本:内容为“测试BOM”的txt文本,另... Java DOM UIF-8文件乱码 java读写UTF-8文件的方法 java中文件操作体现了设计模式中的装饰者模式。

需导入的包:importjava.io.BufferedReader;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.F... java 设计模式 文件操作 装饰者模式 写入文件 UTF-8文件的Unicode签名BOM(ByteOrderMark)问题 近日在调测一个UTF8编码的中文ZenCart网站时遇到一件怪事,网页显示文字正常,用ie的察看源文件(记事本打开)却发现乱码,firefox没有这个问题。

经在网上多方查证和多次测试,解决了这个问题,其实是UTF-8文件的U... ico php 文本文件 十六进制 另存为 utf-8BOM UTF-8不需要BOM,尽管Unicode标准允许在UTF-8中使用BOM。

所以不含BOM的UTF-8才是标准形式,在UTF-8文件中放置BOM主要是微软的习惯(顺便提一下:把带有BOM的小端序UTF-16称作「Unicode」而又不详... 编码BOM BufferedReader读取UTF-8文件乱码 BufferedReaderbr=newBufferedReader(newInputStreamReader(urlcon.getInputStream(),Charset.forName("utf-8"))); 职场 乱码 休闲 utf-8与utf-8(无BOM)的区别 BOM——ByteOrderMark,就是字节序标记 在UCS编码中有一个叫做"ZEROWIDTHNO-BREAKSPACE"的字符,它的编码是FEFF。

而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。

UCS规范建议我们在传输字节流前... 字节序 php 字节流 另存为 mysql JAVA输出带BOM的UTF-8编码的文件 当从http的response输出CSV文件的时候,设置为utf8的时候默认是不带bom的,可是windows的Excel是使用bom来确认utf8编码的,全部须要把bom写到文件的开头。

微软在UTF-8中使用BOM是由于这样能够把UTF-8和ASCI... ico 文本文件 编码方式 BufferedReader读取UTF-8文件中文乱码 引用:http://blog.sina.com.cn/s/blog_6a5a46790100lhub.html读取html文件乱码:BufferedReaderread=newBufferedReader(newFileReader(newFile(filename)));解决办法:InputStreamReaderisr=newInputS... 程序语言--------Java html 构造器 UTF-8和UTF—8Bom的区别(转)UTF-8和UTF—8Bom的区别(转)  在我们通常使用的windows系统中,我发现了一个有趣的现象。

我新建一个空的文本文档,点击文件-另存为-编码选择UTF-8,然后保存。

此时这个文件明明是空的,却占了3字节大小。

原因在于:此时保存的编码方式自动... ico 16进制 编码方式 notepad++ windows系统 去除UTF-8BOM【转】 utf8的编码有no bom & bom 区分。


而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。

UCS规范建议我们在传输... java 字节流 字节序 php UTF-8的BOM带来的麻烦 UTF-8的BOM带来的麻烦工作需要我用程序生成一个html文件。

由于服务器端使用apache+Tomcat来执行html和jsp文件。

开始生成html文件放在apache目录下,页面无法默认正常识别我页面设置的编码。

必须手动在浏览器上... ico html 字节流 java 字节序 linux下批量查找UTF-8的BOM文件,并去除BOM  首先查找看看有哪些文件包含BOMfind.-typef-print0|xargs-0rawk'/^\xEF\xBB\xBF/{printFILENAME}{nextfile}' 然后执行去除动作find.-typef-execsed-i-e'1s/^\xEF\xBB\xBF//'{}\;... sed 文件包含 技术 UTF-8BOMadventuresinC# UTF-8BOMadventuresinC#streamwriter的源码里面做了事情,把preamble写入了privatevoidFlush(boolflushStream,boolflushEncoder){if(this.stream==null){... ico html sed c# microsoft UTF-8、Unicode和BOM问题 经常遇到的问题是,使用了BOM编码后,脚本执行错误,或使用fileStream读取并转换为XML会报错"Themarkupinthedocumentfollowingtherootelementmustbewell-formed."。

一、介绍UTF-8是一种在web应用... ico 字节流 模版 编码方式 文本文件 VS设置UTF-8(无BOM) 1、打开VS,安装插件“ForceUTF-8”2、设置注册表,解决终端中文异常win10系统可以设置如下:系统设置–>时间和语言-->语言–>管理语言设置-->更改系统区域设置–>勾选UnicodeUTF-8并... 安装插件 系统设置 乱码问题 系统环境 ico utf-8无bom格式编码 BOM——ByteOrderMark,就是字节序标记在UCS编码中有一个叫做"ZEROWIDTHNO-BREAKSPACE"的字符,它的编码是FEFF。

而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。

UCS规范建议我们在传输字节流前... 其他 快乐领读 关注 私信 近期文章 1.微软确认将推出Win1021H1更新,于2021年初开始测试 2.“救火先锋”华为荣耀 3.程序员们赶快醒醒,提升认知比不停写代码更重要 4.四款必备的硬盘测试/检测工具使用介绍 5.新版Chrome怎么安装第三方来源的扩展程序? 分类列表 #图解性能优化1篇 文章目录 Java处理UTF-8文件的BOM头部 增加BOM到UTF-8文件 检查文件是否包含BOM头部 移除UTF-8文件的BOM头部 复制UTF-8文件并追加BOM 签到领勋章 返回顶部 举报文章 请选择举报类型 内容侵权 涉嫌营销 内容抄袭 违法信息 其他 具体原因 包含不真实信息 涉及个人隐私 原文链接(必填) 补充说明 0/200 上传截图 格式支持JPEG/PNG/JPG,图片不超过1.9M 取消 确认 已经收到您得举报信息,我们会尽快审核 赞 收藏 评论 分享 51CTO博客 首页 关注 排行榜 订阅专栏 学堂 精培 开源社区 CTO训练营 51CTO 班级博客 登录注册 手机随时阅读 写文章 搜索历史 清空 热门搜索 查看【 】的结果 Copyright©2005-202251CTO.COM 版权所有京ICP证060544号 关于我们 官方博客 意见反馈 了解我们 全部文章 在线客服 网站地图 热门标签 友情链接 开源基础软件社区 51CTO学堂 51CTO



請為這篇文章評分?