我正在从包含此类内容的XML文件中导入数据:
<FirstName>™MšR</FirstName><MiddleName/><LastName>HšNER™Z</LastName>
XML通过以下方式加载:
XmlDocument doc = new XmlDocument();
try
{
doc.Load(fullFilePath);
}
当我使用顶部包含的数据执行此代码时,我得到一个关于非法字符的异常。我理解那部分就好了。
我不确定这是哪种编码或如何解决此问题。有没有办法可以更改XmlDocument或其他方法的编码,以确保正确解析上述内容?
更新:我在本文档中没有任何编码声明或<?xml
。
我看过一些链接说动态添加它?这是UTF-16编码吗?
答案 0 :(得分:3)
看来:
ÖMÜR HÜNERÖZ
(或可能是ÔMÜR HÜNERÔZ
或ÕMÜR HÜNERÕZ
;我不知道是哪种语言。答案 1 :(得分:2)
如果您使用十六进制编辑器(例如HXD或Visual Studio)查看文件,您看到了什么?
您发布的字符串中的每个字符都是由单个字节表示的吗?该文件是否有字节顺序标记(文件开头有一堆不可打印的字节)?
The™和š似乎表明在编码/转换过程中出现了一些问题,但是让我们看看......我猜它们都与元音相对应( O -M- <强> A -R H- A -NER- O -Z,也许?),但我还没弄清楚他们最后是怎么看的像这样...
编辑:dan04击中头部。 cp-1252中的™
的十六进制值为99,š
为9a。在cp-437和cp-850中,十六进制99表示Ö
,而9a表示Ü
。
修复很简单:只需在打开XML文件时指定此编码:
XmlDocument doc = new XmlDocument();
using (var reader = new StreamReader(fileName, Encoding.GetEncoding(437)))
{
doc.Load(reader);
}
答案 2 :(得分:1)
来自here:
Encoding encoding;
using (var stream = new MemoryStream(bytes))
{
using (var xmlreader = new XmlTextReader(stream))
{
xmlreader.MoveToContent();
encoding = xmlreader.Encoding;
}
}
您可能需要查看此内容:How to best detect encoding in XML file?
对于实际阅读,您可以使用StreamReader来处理BOM(字节顺序标记):
string xml;
using (var reader = new StreamReader("FilePath", true))
{ // ↑
xml= reader.ReadToEnd(); // detectEncodingFromByteOrderMarks
}
修改:删除了编码参数。如果文件包含BOM,StreamReader将检测文件的编码。如果不是,它将默认为UTF8。
答案 3 :(得分:0)
显然你提供了一个XML文档的片段,因为它缺少一个根元素,所以我认为这是你的意图。顶部是否有像<?xml version="1.0" encoding="UTF-8" ?>
一样的xml处理指令?