如何修复代理对(0xD83D,0x27)无效

时间:2017-10-17 10:04:44

标签: c# xml encoding utf-8 emoji

我有一个字节数组,文本是xml,带有" Hei"。我做了

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]的正则表达式但它与该表情符号不匹配。

1 个答案:

答案 0 :(得分: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;
            });
        }