代码之家  ›  专栏  ›  技术社区  ›  Victor Chelaru

为什么Android上使用Xamarin的XML序列化会创建一个以(char)65279开头的字符串

  •  1
  • Victor Chelaru  · 技术社区  · 6 年前

    我正在处理移动应用程序中的一些崩溃问题,我正试图尽可能缩小问题的范围。在这个过程中,我发现了一些相当奇怪的行为。

    这是在Android上使用Xamarin。

    我将其隔离为以下代码(为了保持简短而简化):

    // Using a very simple class:
    public class A
    {
    }
    
    // Then serializing it using XmlSerializer:
    var serializer = new System.Xml.Serialization.XmlSerializer(typeof(A));
    using (MemoryStream memoryStream = new MemoryStream())
    {
        serializer.Serialize(memoryStream, new A());
    
        var array = memoryStream.ToArray();
        var firstChar = System.Text.Encoding.UTF8.GetString(array,
            0, array.Length)[0];
        // look at firstChar in the watch window
    }
    

    firstChar 似乎是一个空字符,但 (int)firstChar 在“监视”窗口中生成结果 65279

    我在台式电脑上使用了完全相同的代码。NET 4.6.1控制台应用程序,第一个字符显示为 < ,XML中的左括号。

    我应该指出,在奇怪的第一个字符之后,XML的其余部分是正确的——它只是在前面加了一个字母。

    为什么Android会有这种行为?我是否可以安全地去掉第一个字符,这样我的Android应用程序的行为与我的PC应用程序相同,这样我就可以进一步隔离导致崩溃的差异?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Robbit    6 年前

    引用自 here :

    产生结果的原因是您正在调用编码。UTF8。GetString,用于将UTF8编码中的字节序列转换为C#字符串。

    65279 prepend UTF-8物料清单。

    就像杰森所说的, here ,您可以执行以下操作:

    using (System.IO.MemoryStream memoryStream = new System.IO.MemoryStream())
    {
        var serializer = new XmlSerializer(typeof(A));
        Encoding utf8EncodingWithNoByteOrderMark = new UTF8Encoding(false);
        XmlTextWriter xtw = new XmlTextWriter(memoryStream, utf8EncodingWithNoByteOrderMark);
        serializer.Serialize(xtw, new A());
        string xml = Encoding.UTF8.GetString(memoryStream.ToArray());
        Log.Error("lv", xml[0]+"");
    }
    

    使您的Android应用程序与PC应用程序的行为相同。