c# - StreamWriter 和 Encoding.UTF8.GetBytes 产生不同的结果

标签 c# utf-8

为什么使用 StreamWriter 将字符串编码为 byte[]和UTF8.GetBytes产生不同的结果?:

string value = "myTestValue";

byte[] data = Encoding.UTF8.GetBytes(value);
byte[] streamedData;
using (var memoryStream = new MemoryStream())
using (var streamWriter = new StreamWriter(memoryStream, Encoding.UTF8))
{
    streamWriter.Write(value);
    streamWriter.Flush();
    streamedData = memoryStream.ToArray();
}

//false
data.SequenceEqual(streamedData);

最佳答案

这都是关于 BOM以及 Encoding.GetBytes() 的实现方式。

静态对象 Encoding.UTF8 被初始化为包含 BOM,如您在

中看到的
Encoding.UTF8.GetPreamble();

因此 StreamWriter 正确地将其写入给定的 Stream 对象(带有 BOM)。然而,Encoding.GetBytes() 永远不会发出 BOM;即使您构造 UTF8Encoding 对象来执行此操作:

byte[] withoutBom = new UTF8Encoding(false).GetBytes(value);
byte[] withBom = new UTF8Encoding(true).GetBytes(value);

// true
withoutBom.SequenceEqual(withBom);

如果您希望 StreamWriter 进行无 BOM 编码,您可以像这样初始化它:

new StreamWriter(stream, new UTF8Encoding(false)

这样两个二进制文件将是相等的。

关于c# - StreamWriter 和 Encoding.UTF8.GetBytes 产生不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48321896/

相关文章:

c# - 设置文件的ACL被继承

utf-8 - 如何使用 pdftotext 将文本文件保存为 UTF-8 格式

encoding - notepad++ 显示 ucs-2LE 而 ubuntu FILE [file] 显示 UTF-16LE,我很困惑?

c# - 套接字代理服务器

c# - 使用 LINQ 连接后获取特定对象

c# - 是否可以在asp.net mvc中按成员角色进行缓存?

php - mysql 查询中的文本是否可能不遵守排序规则?

mysql - 获取 UTF8 字符作为 ???当使用 Zend DB 将结果提取到应用程序时

PHP:html_entity_decode 删除/不显示字符

c# - 如何从 MVC3 中的 _Layout.CSHTML 页面调用和传递 c# 帮助程序代码?