我们都知道,文件有不同的编码,例如我们常用的中文编码有:UTF8、GK2312 等。

Windows 操作系统中,新建的文件会在起始部分加入几个字符的前缀,来识别编码。

例如,新建文本文件,写入单词 Hello,另存为 UTF8。Hello 占 5 个字节,但文本大小却是 8 个字节。(win7 系统下还是这样的,win10 已经去掉了编码前缀,所以 win10 下文件大小依然是 5 个字节。看来微软自己也改变了。)

我们用 StreamWriter 来生成文件。

using (StreamWriter sw = new StreamWriter("a.txt"))
{
sw.Write("Hello"); // 5 字节
} using (StreamWriter sw = new StreamWriter("b.txt", false, Encoding.UTF8))
{
sw.Write("Hello"); // 8 字节
}

诡异的事情发生了,StreamWriter 的默认编码是 UTF8,都是用的 UTF8 编码,怎么文件的大小会不一样呢?

UTF8Encoding 有两个私有属性:emitUTF8IdentifierisThrowException,初始化时由构造函数传入。

  • emitUTF8Identifier 表示是否添加编码前缀
  • isThrowException 表示遇到编码错误时是否报错

由此可见,是否添加编码前缀,是可以控制的。

EncodingUTF8 定义如下,添加编码前缀。

public static Encoding UTF8 {
get {
if (utf8Encoding == null) utf8Encoding = new UTF8Encoding(true);
return utf8Encoding;
}
}

StreamWriter 中使用的默认编码,emitUTF8Identifier=false

internal static Encoding UTF8NoBOM {
get {
if (_UTF8NoBOM == null) {
UTF8Encoding noBOM = new UTF8Encoding(false, true);
_UTF8NoBOM = noBOM;
}
return _UTF8NoBOM;
}
}

这就是开头的代码中两个文件大小不一样的原因了。

【C#】写文件时如何去掉编码前缀的更多相关文章

  1. java写文件时,输出不完整的原因以及解决方法

    在java的IO体系中,写文件通常会用到下面语句 BufferedWriter bo=new BufferedWriter(new FileWriter("sql语句.txt")) ...

  2. java写文件时,输出不完整的原因以及解决方法close()或flush()

    在java的IO体系中,写文件通常会用到下面语句 BufferedWriter bw=new BufferedWriter(new FileWriter("sql语句.txt")) ...

  3. Sublime Text保存文件时自动去掉行末空格

    修改一个Sublime Text的用户配置,其中这个配置就是"保存文件时自动去掉每行结束后多余的空格",具体操作如下: 在Sublime Text菜单栏中找到preferences ...

  4. 使用 Java 程序写文件时,记得要 flush()

    使用 Java 程序往磁盘写文件时碰到了这样的问题:文件写不全. 假如内容(StringBuffer/StringBuilder)有 100W 个字符,但是通过 Java 程序写到文件里的却不到 10 ...

  5. sublime python3中读取和写入文件时如何解决编码问题

    # -*- coding: utf-8 -*- #分析用户身份审核信息 #python 3.5 #xiaodeng #http://apistore.baidu.com/apiworks/servic ...

  6. Python 写文件时的Unicode设置

    今天在把Evenote的笔记内容写为文件时出错:     f.write(content) UnicodeEncodeError: 'gbk' codec can& ...

  7. jdk编译java文件时出现:编码GBK的不可映射字符

    出现此问题的几种解决办法: 1.cmd下使用javac编译java文件 如: javac test.java 解决办法:编译时加上encoding选项 javac -encoding UTF-8 te ...

  8. 爬虫 写入文件时遇到gbk编码错误

    #获取视频地址 # 每次请求一次,然后写文件,这样可以规避多次请求触发反爬虫 r = requests.get('https://www.pearvideo.com/video_1522192') h ...

  9. java写文件时往末尾追加文件(而不是覆盖原文件),的两种方法总结

    代码如下: import java.io.FileWriter; import java.io.IOException; import java.io.RandomAccessFile; public ...

随机推荐

  1. python常用内置模块-random模块

    random模块:用于生成随机数 '''关于数据类型序列相关,参照https://www.cnblogs.com/yyds/p/6123692.html''' random() 随机获取0 到1 之间 ...

  2. 钝化 会钝化 订单审批流程 码一会er

    先放一张订单审批流程图.预则立嘛

  3. ssh隧道使用

    在内网中几乎所有的linux服务器和网络设备都支持ssh协议.一般情况下,ssh协议是允许通过防火墙和边界设备的,所以经常被攻击者利用.同时ssh协议的传输过程是加密的,所以我们很难区分合法的ssh会 ...

  4. ios--->cell里面 self 和self.contentview的区别

    一般我们向cell中添加子视图,有两种方式 [cell addSubview:] [cell.contentView addSubview:] 区别在于进行cell编辑时,比如cell内容向左移或者右 ...

  5. 简单总结关于阿里云CDN的知识

    CDN概念剖析 这里解释一下几个概念,摘自阿里云官方文档. 源站: 源站决定了回源时,请求到哪个IP 回源host:回源host决定回源请求访问到该IP上的哪个站点 例子1:源站是域名 源站为 www ...

  6. 量子搜索算法 Grover search

    问题定义: Problem: \(f: \{ 0,1,2,3,--,N-1 \} \rightarrow \{0,1\}\) 找到 \(f(x)=1\) 的x 解法 经典解法: 经典解法很简单,就是把 ...

  7. SOAP与REST API的爱恨情仇

    之前一直想写些RESTful相关的文章,却一直未付诸行动.直到最近接手一个新的项目,对这块重新温习,乘此机会写些相关帖子.欢迎大家评论留言,如有错漏之处,也望各位大佬不令赐教. 话不多说,干活顶上. ...

  8. react中 如何使用图片

    //render 第一种方法:先const一个对象,把需要应用图片的dom上的style写入对象中, 然后在return()中使用style关键字赋值为预先定义的那个style对象 const bgG ...

  9. 为什么用nginx:它的5个主要优点

    1.高并发,高性能 2.可扩展性好啊 3.高可靠性 4.热部署 5.BSD许可证

  10. High一下!

    代码: <a title="把这个链接拖到你的Chrome收藏夹工具栏中" href='javascript:(function() { function c() { var ...