C#写UTF8文件时指定是否含BOM头
BOM的基本概念
在UCS 编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。
UTF-8中的BOM
UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。
UTF-8编码的文件中,BOM占三个字节。如果用记事本把一个文本文件另存为UTF-8编码方式的话,用UE打开这个文件,切换到十六进制编辑状态就可以看到开头的FFFE了。这是个标识UTF-8编码文件的好办法,软件通过BOM来识别这个文件是否是UTF-8编码。
对于含BOM头的UTF8文件,前三个字节是\xEF\xBF\xBD,某些软件对于不包含BOM头格式的文件识别存在问题,而有些软件对于有BOM头的文件解析有问题。所以这个问题要区别对待,我们可以在Notepad++里进行转换。
C#写文件时指定是否有BOM
下面是C#在写文件时指定BOM头的代码:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
var utf8WithBom = new System.Text.UTF8Encoding(true); // 用true来指定包含bomStreamWriter swr = null;try{ swr = new StreamWriter("okbase.txt", false, utf8WithBom); swr.Write("hello okbase.net!");}catch(Exception e){}finally{ if (swr != null) { swr.Close(); swr.Dispose(); }} |
下面的代码是不需要BOM:
|
1
2
3
4
5
|
var utf8WithoutBom = new System.Text.UTF8Encoding(false);using (var sink = new StreamWriter("Foobar.txt", false, utf8WithoutBom)){sink.WriteLine("...");} |
C#写UTF8文件时指定是否含BOM头的更多相关文章
- Python写UTF8文件,UE、记事本打开依然乱码的问题
Python写UTF8文件,UE.记事本打开依然乱码的问题 Leave a reply 现象:使用codecs打开文件,写入UTF-8文本,正常无错误.用vim打开正常,但记事本.UE等打开乱码. 原 ...
- linux tar 解压文件时指定文件名
linux解压文件时指定文件夹名称 wget -O mysql-5.6.15.tar.gz http://oss.aliyuncs.com/aliyunecs/onekey/mysql/my ...
- 【python】写csv文件时遇到的错误
1.错误 在许多文件中,写入csv文件时都加"wb",w指写入,b指二进制 如: csvwrite=csv.writer(open("output.csv",& ...
- python2.7写入文件时指定编码为utf-8
python3.0可以这样写 f = open('ufile.log', 'w', 'utf-8') 但在python2.7中open()没有编码参数,如上那样写会报错,可以使用如下模块 impo ...
- 写jsp文件时需要注意的一些小细节
①jsp文件的最开始的部分: <%@ page language="java" contentType="text/html; charset=UTF-8" ...
- 用DOM和DOM4J写xml文件时,怎样设置xml文档的编码
//在将xml文档传输出去时,利用Transformer中的setOutputProperty方法 TransformerFactory trans = TransformerFactory.newI ...
- 当碰到非ARC写的文件时在ARC环境下运行报错时解决办法
- java项目导出jar文件时指定main方法的类
需要先运行一下main函数,eclipse的Export-->Runnable JAR File ---> 下的Launch configuration下拉列表才会有记录.如果想要删除下拉 ...
- Python 写文件时的Unicode设置
今天在把Evenote的笔记内容写为文件时出错: f.write(content) UnicodeEncodeError: 'gbk' codec can& ...
随机推荐
- 利用backtrace和ucontex定位segment错误【转】
转自:https://blog.csdn.net/gqtcgq/article/details/53883546 C程序运行时,经常会碰到”segmentfault”错误.这是由于程序中非法访问内存导 ...
- 五大常见的MySQL高可用方案【转】
1. 概述 我们在考虑MySQL数据库的高可用的架构时,主要要考虑如下几方面: 如果数据库发生了宕机或者意外中断等故障,能尽快恢复数据库的可用性,尽可能的减少停机时间,保证业务不会因为数据库的故障而中 ...
- 001_chrome工具详解
一.chrome https://segmentfault.com/a/1190000000683599
- 使用管道和cronolog切割日志
安装cronolog git clone https://github.com/fordmason/cronolog ./configure make && make install ...
- DNS的服务器和客户端的配置
内网环境Linux发行版本均采用centos为主,centos下DNS服务端的搭建步骤如下: DNS master节点搭建步骤: 安装组件: yum install bind; yum in ...
- 织梦任意页面调用{dede:field.content/}的方法
过滤掉所有的html代码,只显示文字,具体的ID自己更改. 代码如下: {dede:sql sql='Select content from dede_arctype where id=1'} [fi ...
- TcxGrid 调整列位置的事件
- Laravel中使用自己的类库三种方式
虽然Composer使得我们可以重用很多现有的类库(例如packagist.org中的),但是我们仍然可能用到一些不兼容composer的包或者类库.另外在某一项目中,我们也可能会创建某一类库,而且可 ...
- ajax最基础入门
1.介绍 AJAX = 异步 JavaScript 和 XML. AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重 ...
- G 最短路
题目描述三国时期,南蛮王孟获叛乱,诸葛亮起兵平乱.当深入南蛮之地时,遇当地人绘得地图,发现各地分别由各个寨主据守,若诸葛亮想兵分多路进军,尽快占领各个山寨(必须占领所有山寨),并且最终所有士兵都汇聚到 ...