Java处理UTF-8文件的BOM头部 - 51CTO博客
文章推薦指數: 80 %
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;
}
}
上面的代码需要一个依赖:
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
延伸文章資訊
- 1[ Java 常見問題] Handle UTF8 file with BOM - 程式扎記
參考至 這裡. Preface : 編碼問題一直是編程人員處理上很頭痛的問題, 特別是在處理 BOM 的時候. 舉例來說, 考慮有一個UTF-8 編碼檔案內容如下:
- 2Java - How to add and remove BOM from UTF-8 file
1. Add BOM to a UTF-8 file ... To Add BOM to a UTF-8 file, we can directly write Unicode \ufeff o...
- 3Java处理UTF-8文件的BOM头部 - 51CTO博客
Java处理UTF-8文件的BOM头部. BOM——Byte Order Mark,就是字节序标记。 基本概念. 在 UCS 编码 中有一个叫做” ZERO WIDTH NO-BREAK SPA...
- 4Handle UTF8 file with BOM - Real's Java How-to
UTF8 file are a special case because it is not recommended to add a BOM to them. The presence of ...
- 5How to add a UTF-8 BOM in Java? - Stack Overflow
As noted in section 23.8 of the Unicode 9 specification, the BOM for UTF-8 is EF BB BF . That seq...