Encoding.UTF8.GetBytes和UTF8Encoding.Default.GetBytes之间的区别

11

请问一下,Encoding.UTF8.GetBytes和UTF8Encoding.Default.GetBytes有什么区别?其实我正在尝试将XML字符串转换为流对象,但现在的情况是无论我使用哪一行代码:

  MemoryStream stream = new MemoryStream(UTF8Encoding.Default.GetBytes(xml));

它给我一个错误“System.Xml.XmlException:在给定的编码中存在无效字符”

但是当我使用这行代码时,它可以正常运行:

  **MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(xml));**

尽管两种情况看起来都是UTF8编码,但为什么一个能够工作而另一个不能呢?

1个回答

17

没有UTF8Encoding.Default属性。 当您写入此内容时,实际上返回的是基类静态属性Encoding.Default,该属性不是UTF8(它是系统默认的ANSI代码页编码)。

因此,两者将返回非常不同的结果 - 因为UTF8Encoding.Default实际上是Encoding.Default,您将返回与使用ASCIIEncoding.Default或任何其他System.Text.Encoding子类相同的内容。

使用UTF8Encoding的正确方法是使用您创建的实例,例如:

MemoryStream stream = new MemoryStream((new UTF8Encoding()).GetBytes(xml));

上述内容应该会与以下内容产生相同的结果:

MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(xml));

将“使用UTF8Encoding的属性方式”更改为“正确的方式”...由于只有2个字符的更改,因此无法编辑。 - Kevin
请勿在创建XML时进行字符串操作,否则当您的XML包含非ASCII字符时,您可能会遇到编码不匹配的问题。使用XmlDocumentXDocumentXmlWriter方法将XML保存到MemoryStream中,将为您和数据用户节省大量痛苦,因为这些方法可以避免无效的XML文件。 - Alexei Levenkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接