为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
qq_花开花谢_0 2019-11-18 13:04:41
我读过类似的文章,但他们没有回答我的问题。在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的“正确”算法?谢谢!
查看完整描述

3 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

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


查看完整回答
反对 回复 2019-11-18
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

我的测试数据不正确,这使我有些困惑。基于如何在读取文件时避免跳入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仍然不会读取该字符串。这是我到目前为止提出的最干净的版本。


查看完整回答
反对 回复 2019-11-18
  • 3 回答
  • 0 关注
  • 345 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信