3

我今天已经对此进行了很多搜索,但找不到如何使用 UTF-8 编码进行反序列化。

 <?xml version="1.0" encoding="UTF-8"?>
 <AvailabilityRequestV2 xmlns="" xmlns:xsi="http://www.w3.org/2001/XMLSchema- instance"
 siteid="0000"
 apikey="0000"
 async="false" waittime="0">
 <Type>4</Type>
 <Id>159266</Id>
 <Radius>0</Radius>
 <Latitude>0</Latitude>
 <Longitude>0</Longitude>
 </AvailabilityRequestV2>

如果我试试这个

 string xmlString = File above;         
 XmlSerializer serializer = new XmlSerializer(typeof(AvailabilityRequestV2));
 AvailabilityRequestV2 request = (AvailabilityRequestV2)serializer.Deserialize(
     new MemoryStream(Encoding.UTF8.GetBytes(xmlString)));

如果我将鼠标置于调试模式下请求我得到这个:

     {<?xml version="1.0" encoding="utf-16"?><AvailabilityRequestV2 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
      xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      ..................

我怎样才能强制成为 UTF-8 ?

我只看到序列化,但反序列化我没有。

4

3 回答 3

11

您可以使用 aStreamReader并指定 UTF-8,也可以告诉它使用 BOM(如果存在):

using (StreamReader reader = new StreamReader("my.xml",Encoding.UTF8,true)) {
    XmlSerializer serializer = new XmlSerializer(typeof(SomeType));

    object result = serializer.Deserialize(reader);
}

我不确定当 XML 阅读器遇到 XML 中的encoding="utf-16"指令时会发生什么,它可能会切换。

于 2013-02-25T17:31:41.030 回答
3

一旦您将文件的内容转换为 .Net/CLR 字符串,它就会采用 UTF-16 编码:它已从其原始源编码转换。CLR 在内部使用 UTF-16——因此char是 16 位的原因。

因此,文档的 [原始] XML 声明中指定的编码现在与文档的实际编码不一致。

最好StreamReader按照上面@Lloyd 的建议通过a。

于 2013-02-25T17:46:30.213 回答
2

我认为@Lloyd 的示例需要new关键字:

using (StreamReader reader = new StreamReader("my.xml",Encoding.UTF8,true)) {
于 2016-02-22T21:40:13.933 回答