Unicode编码 - 处理字节顺序标记

时间:2014-05-20 09:43:36

标签: .net xml serialization unicode encoding

我需要将一些对象序列化为blob以传递给Web服务调用。所有非常基本的东西。

问题的核心是执行工作的代码片段非常不灵活,因为在使用StringWriter时,输出的编码总是UTF-16

        StringWriter stringWriter = new StringWriter();
        serialiser.Serialize(stringWriter, Container.Calls);
        string data = stringWriter.ToString();

处理大多数情况但我希望尽可能使其成为通用的&处理其他编码,所以我将上面的内容更改为此(我可以在以后重构并传递编码):

        XmlTextWriter xmlTextWriter = new XmlTextWriter(stream,Encoding.Unicode);
        serialiser.Serialize(xmlTextWriter, Container.Calls);
        byte[] bytes = stream.GetBuffer();
        string data = System.Text.Encoding.Unicode.GetString(bytes);

System.Text.Encoding.Unicode.GetString不再返回有效的xml,因为在流的开头有一个字节顺序标记。我可以调用stream.Read并指定BOM的偏移量,但是,依赖于编码,我并不总是希望它存在,所以这可能会变得混乱。我真正需要的是它根本就不存在。

1 个答案:

答案 0 :(得分:0)

来自其他帖子(StreamWriter and UTF-8 Byte Order Marks):

"问题是由于您在Encoding类上使用静态UTF8属性。

当在UTF8属性返回的Encoding类的实例上调用GetPreamble方法时,它返回字节顺序标记(三个字符的字节数组),并在将任何其他内容写入之前写入流中。流"

所以,在这种情况下我改变了

XmlTextWriter xmlTextWriter = new XmlTextWriter(stream,Encoding.Unicode);

XmlTextWriter xmlTextWriter = new XmlTextWriter(stream,new System.Text.UnicodeEncoding  (false,false));

它运作正常。