C# StreamReader与MemoryStream.ToArray
与使用C# StreamReader与MemoryStream.ToArray,c#,C#,与使用StreamReader相比,为什么MemoryStream.ToArray在输出字符串的开头有一个额外的字符 public void StreamOutputTest() { var document = new XDocument( new XElement( "root" ) ); string actual1; string actual2; using( var stream = new MemoryStream() ) {
StreamReader
相比,为什么MemoryStream.ToArray
在输出字符串的开头有一个额外的字符
public void StreamOutputTest()
{
var document = new XDocument( new XElement( "root" ) );
string actual1;
string actual2;
using( var stream = new MemoryStream() )
{
using( var writer = new StreamWriter( stream, Encoding.UTF8 ) )
{
document.Save( writer, SaveOptions.DisableFormatting );
stream.Position = 0;
using( var reader = new StreamReader( stream, Encoding.UTF8 ) )
{
actual1 = reader.ReadToEnd();
}
actual2 = Encoding.UTF8.GetString( stream.ToArray() );
}
}
var expected = "<?xml version=\"1.0\" encoding=\"utf-8\"?><root />";
Assert.AreEqual( expected, actual1 ); // succeeds
Assert.AreEqual( expected, actual2.Substring( 1 ) ); // succeeds
Assert.AreEqual( expected, actual2 ); // fails
}
public void StreamOutputTest()
{
var文档=新XDocument(新XElement(“根”));
字符串1;
字符串实际值L2;
使用(var stream=new MemoryStream())
{
使用(var writer=newstreamwriter(stream,Encoding.UTF8))
{
document.Save(writer,SaveOptions.DisableFormatting);
流位置=0;
使用(var reader=newstreamreader(stream,Encoding.UTF8))
{
actual1=reader.ReadToEnd();
}
actual2=Encoding.UTF8.GetString(stream.ToArray());
}
}
预期var=”;
Assert.AreEqual(预期,实际);//成功
Assert.AreEqual(应为,actual2.Substring(1));//成功
Assert.AreEqual(预期,实际);//失败
}
65279的额外字节值是以十六进制表示的FEFF
,十六进制是UTF-16编码的字节顺序标记
请在此处阅读字节顺序标记:的额外字节值
65279
为FEFF
十六进制,这是UTF-16编码的字节顺序标记
请在此处阅读字节顺序标记:额外字符的值是多少?字符串以C#结尾为null…我想这可能是一个字节顺序标记。@toadflakz额外的字符在字符串的开头,但它的值是65279,我假设这只是当时内存中的一个值。
actual1
和actual2
的值是多少?@webber2k6我添加了另一个断言,以显示除第一个字符外的所有字符都与预期值匹配。额外字符的值是多少?字符串以C#结尾为null…我想这可能是一个字节顺序标记。@toadflakz额外的字符在字符串的开头,但它的值是65279,我假设这只是当时内存中的一个值。actual1
和actual2
的值是多少?@webber2k6我添加了另一个断言,以显示除第一个字符外的所有字符都与预期值匹配。谢谢。当流写入器为UTF-8时,为什么字节顺序标记为UTF-16?Tbh我不完全确定。正如您所说,StreamWriter
正在使用正确的编码,除非document.Save()
覆盖了该编码?发布的代码中存在一些不一致之处-例如,StreamReader
在构造函数中没有显式编码。也就是说,经过实验,如果使用UTF7、UTF8或UTF32编码,字符串的Encoding.XXX.GetString
版本在开始时具有UTF16 BOM,这似乎很奇怪!(ASCII不…)我想我们在这里被术语弄糊涂了。NET字符串默认为Unicode(UTF-16)afaik。读取方法(GetString()
)读取UTF-8格式,而不是返回UTF-8编码的字符串。@DanPuzey谢谢。我已经修好了StreamReader。谢谢。当流写入器为UTF-8时,为什么字节顺序标记为UTF-16?Tbh我不完全确定。正如您所说,StreamWriter
正在使用正确的编码,除非document.Save()
覆盖了该编码?发布的代码中存在一些不一致之处-例如,StreamReader
在构造函数中没有显式编码。也就是说,经过实验,如果使用UTF7、UTF8或UTF32编码,字符串的Encoding.XXX.GetString
版本在开始时具有UTF16 BOM,这似乎很奇怪!(ASCII不…)我想我们在这里被术语弄糊涂了。NET字符串默认为Unicode(UTF-16)afaik。读取方法(GetString()
)读取UTF-8格式,而不是返回UTF-8编码的字符串。@DanPuzey谢谢。我已经修好了StreamReader。