2017-10-17 260 views
0

我有一个字节数组,文本是xml与“Hei”。我做如何解决代理对(0xD83D,0x27)无效

var bodyText = Encoding.UTF8.GetString(transportMessage.Body); 
var bodyXml = XElement.Parse(bodyText); 

获取字符串编码的表情符号&# xD83D;&#x DE0A;所以XElement.Parse抛出:

System.InvalidOperationException:有一个错误生成XML文档。 --- > System.ArgumentException:代理对(0xD83D,0x27)无效。高代理字符(0xD800 - 0xDBFF)必须始终与低代理字符(0xDC00 - 0xDFFF)配对。

我怎样才能删除此表情符(或任何其他)我试图用正则表达式与无效的XML字符[^\x09\x0A\x0D\x20-\xD7FF\xE000-\xFFFD\x10000-x10FFFF]但它不匹配的表情符号。

+0

您是否收到的Unicode?如果是这样,那么使用Encoding.Unicode(不是UTF8)。如果你通过html发送XML,那么你必须编码和解码:System.Net.WebUtility.HtmlEncode()和System.Net.WebUtility.HtmlDecode() – jdweng

+0

不,它不是unicode。邮件的其余部分编码正确,只是表情符号很奇怪 – Margo

+0

'GetString'不编码文本,它对它进行解码。如果'GetString'返回包含'��'的文本,则它必须已经以字节数组的方式编码。你能显示字节数组的内容吗?解码后的字符串是否真的包含空格('�&#x DE0A;'而不是'��')? – Codo

回答

0

我用这个代码删除此:

private static readonly Regex EmojiRegex = new Regex("&#x?[A-Fa-f0-9]+;"); 
private static string ReplaceInvalidXmlCharacterReferences(string input) 
     { 
      if (input.IndexOf("&#") == -1) 
       return input; 

      return EmojiRegex.Replace(input, match => 
      { 
       string ncr = match.Value; 
       uint num; 
       var frmt = NumberFormatInfo.InvariantInfo; 

       bool isParsed = 
        ncr[2] == 'x' ? // the x must be lowercase in XML documents 
        uint.TryParse(ncr.Substring(3, ncr.Length - 4), NumberStyles.AllowHexSpecifier, frmt, out num) : 
        uint.TryParse(ncr.Substring(2, ncr.Length - 3), NumberStyles.Integer, frmt, out num); 

       return isParsed && !XmlConvert.IsXmlChar((char)num) ? "" : ncr; 
      }); 
     } 
相关问题