JAVA输出带BOM的UTF-8编码的文件
bom的,可是windows的Excel是使用bom来确认utf8编码的,全部须要把bom写到文件的开头。
微软在 UTF-8 中使用 BOM 是由于这样能够把 UTF-8 和 ASCII 等编码明白区分开。
否则用Excel打开CSV文件有可能是乱码的
演示样例代码例如以下:
response.setContentType("text/csv");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
response.setCharacterEncoding("UTF-8");
byte[] uft8bom={(byte)0xef,(byte)0xbb,(byte)0xbf};
OutputStream out = response.getOutputStream();
out.write(uft8bom);
OutputStreamWriter writer = new OutputStreamWriter(out,"UTF-8");
//write other content ...
什么是BOM:
BOM(byte-order mark),即字节顺序标记,它是插入到以UTF-8、UTF16或UTF-32编码Unicode文件开头的特殊标记,用来识别Unicode文件的编码类型。对于UTF-8来说,BOM并非必须的。由于BOM是用来标记多字节编码文件的编码类型和字节顺序(big-endian或little- endian)。
而UTF8中,每一个字符的编码有多少位是通过第一个字节来表述的。并且没有big-endian和little-endian的区分,见后述。
BOMs 文件头:
00 00 FE FF = UTF-32, big-endian
FF FE 00 00 = UTF-32, little-endian
EF BB BF = UTF-8,
FE FF = UTF-16, big-endian
FF FE = UTF-16, little-endian
另一个要注意的是:UTF-8 的网页代码不应使用 BOM。否则经常会出错:
在网页上使用BOM是个错误。
BOM设计出来不是用来支持HTML和XML的。要识别文本编码,HTML有charset属性,XML有encoding属性,不是必需拉BOM撑场面。尽管理论上BOM能够用来识别UTF-16编码的HTML页面,但实际project上非常少有人这么干。毕竟UTF-16这样的编码连ASCII都双字节,实在不适用于做网页。
Windows使用BOM的历史原因:
通常BOM是用来标示Unicode纯文本字节流的,用来提供一种方便的方法让文本处理程序识别读入的.txt文件是哪个Unicode编码(UTF-8。UTF-16BE,UTF-16LE)。
Windows相对对BOM处理比較好,是由于Windows把Unicode识别代码集成进了API里。主要是CreateFile()。打开文本文件时它会自己主动识别并剔除BOM。
Windows用这个有历史原因,由于它最初脱胎于多代码页的环境。而引入Unicode时Windows的设计者又希望能在用户不注意的情况下同一时候兼容Unicode和非Unicode(Multiple byte)文本文件,就仅仅能借助这样的小trick了。
带BOM的文本文件在Linux/unix环境又经常会遇到问题:
知乎介绍的非常具体:
http://www.zhihu.com/question/20167122
文本文件解析:
文本文件相应于人类能够阅读的文本,怎样从2进制转换为文本文件呢?起初由于计算机在美国发明。自然大家考虑的是英语怎样表示,英语字母总共26个。加上特殊字符,128个字符,7位既一个byte就可以表示出来。这个就是大家所熟知的ascill编码。
相应关系非常easy,一个字符相应一一个byte。
但非常快发现。其它非英语国家的文字远远超过ascill码,这时候大家当然想统一一下。不同国家出了自己不同的编码方式。中国的gb2312就是自己做出来的编码方式,这样下去每一个国家都有自己的编码方式,来回转换太麻烦了。这时候出现了新的编码方式,unicode编码方式,想将编码统一,所以规定了每一个字符相应的unicode码。 1、非常多文件都是ascii编码,假设用unicode 太浪费。
2、没有标志位说明该几个字节来解析为一个符号。 这时候解救世界的utf出现了。utf是unicode的一种实现,仅仅只是更聪明了。utf16是占用两字节,或者四字节。utf32是占用四字节。
utf8是非常聪明的一种表示方式。
1、对于单字节符号,字节第一位为0,后面7位表示字节编码。
2、对于n字节符号,第一字节的前n位都设为1,第n+1位为0。其余位用于编码。
对于不同的编码,在文本的最前方有不同的标志,unicode 通常有两位来表示各自是ff fe, 或者feff, fffe表示litte-endian 编码feff表示big-endian编码。
utf8是efbbbf来开头的。
能够看出来utf-8是自解释的。所以不用带这个标志文件,大多数程序是能够识别的。
但有些程序不能识别这个标志,比方php就会直接把这个标志当文本解析,不会忽略。
JAVA输出带BOM的UTF-8编码的文件的更多相关文章
- Java以UTF-8编码读写文件
java中文件操作体现了设计模式中的装饰者模式 . 以utf-8编码写入文件: FileOutputStream fos = new FileOutputStream("test.txt&q ...
- utf 8无bom和utf 8什么区别
今天在上传CSV文件的时候,Windows下调试一切正常.妈的一到Linux下面,就出现问题,第一行数据总是读取不出来, 利用print_r()打印出读取文件的内容,发现有一个很奇怪的字符在作怪.为什 ...
- Java NIO之Charset类字符编码对象
介绍 java中使用Charset来表示编码对象 This class defines methods for creating decoders and encoders and for retri ...
- java.net.URLEncoder对中文的编码和解码
// java.net.URLEncoder对中文的编码和解码String str = URLEncoder.encode("测试字符串", "utf-8"); ...
- JAVA支持字符编码读取文件
文件操作,在java中很常用,对于存在特定编码的文件,则需要根据字符编码进行读取,要不容易出现乱码 /** * 读取文件 * @param filePath 文件路径 */ public static ...
- 015 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 09 Unicode编码
015 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 09 Unicode编码 本文知识点:Unicode编码以及字符如何表示? ASCII码是美国提出的标准信息 ...
- 在Vim中查看文件编码和文件编码转换
在Vim中查看文件编码和文件编码转换 风亡小窝 关注 0.2 2016.09.26 22:43* 字数 244 阅读 5663评论 0喜欢 2 在Vim中查看文件编码 :set fileencodi ...
- day 10 字符编码和文件处理 细节整理
pycharm是文本编辑器. 大概理解为: 输出到屏幕上的时候,是解码过的字符串,用 decode 处理的时候要编码成相应的流, encode 成你要用的格式就可以了 1 .字符编码: 字符==== ...
- Python全栈开发之路 【第三篇】:Python基础之字符编码和文件操作
本节内容 一.三元运算 三元运算又称三目运算,是对简单的条件语句的简写,如: 简单条件语句: if 条件成立: val = 1 else: val = 2 改成三元运算: val = 1 if 条件成 ...
随机推荐
- java中 flush()方法的作用
flush() 是清空,而不是刷新啊.一般主要用在IO中,即清空缓冲区数据,就是说你用读写流的时候,其实数据是先被读到了内存中,然后用数据写到文件中,当你数据读完的时候不代表你的数据已经写完了,因为还 ...
- 【JavaEE WEB 开发】Tomcat 具体解释 Servlet 入门
转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/47146817 一. Tomcat 下载安装配置 1. Tomcat 下载 T ...
- python抓取新浪微博评论并分析
1,实现效果 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb2xhbnphbw==/font/5a6L5L2T/fontsize/400/fill ...
- httpClient模拟登陆校内某系统
package com.huowolf; import java.util.ArrayList; import java.util.List; import org.apache.http.HttpE ...
- nyoj--1237--最大岛屿(dfs+数据处理)
最大岛屿 时间限制:1000 ms | 内存限制:65535 KB 难度: 描述 神秘的海洋,惊险的探险之路,打捞海底宝藏,激烈的海战,海盗劫富等等.加勒比海盗,你知道吧?杰克船长驾驶着自己的的战 ...
- IDE-IntelliJ IDEA
IDE-IntelliJ IDEA 主题.字体.编辑区主题.文件编码修改.乱码问题 主题修改 上图标注 1 所示为 IntelliJ IDEA 修改主题的地方,可以通过打开左上角的File -> ...
- PHP正则表达式函数总结
/* 测试环境:PHP5.3.29(PCRE8.32) */ 常用函数:(正则表达式规则基本同JS_RE_Read.txt) PS:1.PHP中的PCRE一般仅使用这三个修饰符:"i&quo ...
- 51nod 1065 最小正字段和 解决办法:set存前缀和,二分插入和二分查找
题目: 这题要求大于0的最小字段和,常规O(n)求最大字段和的方法肯定是没法解的. 我的解法是:用sum[i]存前i项的和,也就是前缀和. 这题就变成了求sum[j]-sum[i]的大于0的最小值( ...
- HTML基础——网站后台显示页面
1.框架集标签:(作用:将页面进行区域的划分) <frameset rows="" cols=""> <frame src="&qu ...
- windows下安装mycat,并简单使用
使用mycat需要先安装jdk1.7以上 参考:http://www.cnblogs.com/llhhll/p/9257764.html 1从官网下载解压后目录如下(1.6版本) 下载地址:https ...