如何告诉ASCIIEncoding类不要解码字节顺序标记

Chr*_*son 1 .net ascii byte-order-mark utf-8

使用.net ASCIIEncoding类将字节数组解码为字符串时,是否需要编写一些代码来检测并删除字节顺序标记,或者是否可以告诉ASCIIEncoding不将字节顺序标记解码为字符串?

这是我的问题,当我这样做时:

string someString = System.Text.ASCIIEncoding.Default.GetString(someByteArray)
Run Code Online (Sandbox Code Playgroud)

someString看起来像这样:

<?xml version="1.0"?>.......
Run Code Online (Sandbox Code Playgroud)

然后我打电话给这个:

XElement.Parse(someString)
Run Code Online (Sandbox Code Playgroud)

由于前三个字节引发异常:EF BB BF - UTF8字节顺序标记.所以我认为,如果我指定UTF8编码,而不是默认,如下所示:

System.Text.ASCIIEncoding.UTF8.GetString(someByteArray)
Run Code Online (Sandbox Code Playgroud)

ASCIIEncoding不会尝试将字节顺序标记解码为字符串.当我将返回的字符串复制到notepad ++中时,我可以看到一个?XML标记前面的字符.所以现在字节顺序标记被解码成单个垃圾字符.在这种情况下,停止解码字节顺序标记的最佳方法是什么?

Jon*_*eet 5

请不要使用

ASCIIEncoding.UTF8
Run Code Online (Sandbox Code Playgroud)

那真是公正

Encoding.UTF8
Run Code Online (Sandbox Code Playgroud)

它根本没用ASCIIEncoding.它只是在你的源代码中看起来像它.

从根本上说,问题是你的文件 UTF-8,它不是 ASCII.这就是为什么它有一个UTF-8字节顺序标记.我强烈建议你用这种 Encoding.UTF8方式读取UTF-8文件.

如果您阅读该文件File.ReadAllText,我怀疑它会自动删除BOM.或者你可以在打电话之前修剪它XElement.Parse.使用错误的编码(ASCII或Encoding.Default)不是正确的方法.同样,它不是垃圾角色.它是一个非常有用的角色,非常强烈地表明它确实一个UTF-8文件 - 只是你不想在这个特定的环境中使用它."垃圾"给人的印象是它不应该存在于文件中的损坏数据,而且绝对不是这样.

另一种方法是避免将其转换为文本.例如:

XElement element;
using (XmlReader reader = XmlReader.Create(new MemoryStream(bytes))
{
    element = XElement.Load(reader);
}
Run Code Online (Sandbox Code Playgroud)

这样编码将被自动检测.