从C#中的字符串中删除字节顺序标记

我读过类似的文章,但他们没有回答我的问题。


在C#中,我有一个从WebClient.DownloadString获得的字符串。我尝试将client.Encoding设置为新的UTF8Encoding(false),但这没什么区别-我仍然在结果字符串的开头以UTF-8的字节顺序标记结束。我需要删除它(以使用LINQ解析生成的XML),并希望在内存中删除它。


所以我有一个以\ x00EF \ x00BB \ x00BF开头的字符串,如果存在,我想删除它。现在我正在使用


if (xml.StartsWith(ByteOrderMarkUtf8))

{

    xml = xml.Remove(0, ByteOrderMarkUtf8.Length);

}

但这感觉不对。我已经尝试了使用流,GetBytes和编码的各种代码,但是没有任何效果。谁能提供从字符串中剥离BOM的“正确”算法?


谢谢!


qq_花开花谢_0
浏览 347回答 3
3回答

12345678_0001

如果变量xml是字符串类型,则您已经做错了-在字符串中,BOM不应表示为三个单独的字符,而应表示为单个代码点。不要使用DownloadString,而要使用DownloadData,并解析字节数组。XML解析器应该识别BOM本身,然后跳过它(自动检测文档编码为UTF-8除外)。

一只甜甜圈

我的测试数据不正确,这使我有些困惑。基于如何在读取文件时避免跳入UTF-8 BOM的问题,我发现这可行:private readonly string _byteOrderMarkUtf8 =    Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());public string GetXmlResponse(Uri resource){    string xml;    using (var client = new WebClient())    {        client.Encoding = Encoding.UTF8;        xml = client.DownloadString(resource);    }    if (xml.StartsWith(_byteOrderMarkUtf8, StringComparison.Ordinal))    {        xml = xml.Remove(0, _byteOrderMarkUtf8.Length);    }    return xml;}正确设置客户端的Encoding属性可将BOM减少为单个字符。但是,XDocument.Parse仍然不会读取该字符串。这是我到目前为止提出的最干净的版本。
打开App,查看更多内容
随时随地看视频慕课网APP