我有一个编码为UTF-8的XML文件:
<?xml version="1.0" encoding="UTF-8"?>
有一个嵌入了Unicode的节点 - 用于保存法语(和其他)字符。
<author>Fr\u00e9d\u00e9ric</author>
我想将此格式化文本加载到文本框中并按预期显示文本,即Frédéric
我正在使用以下内容加载文件,其他所有内容都按预期工作,而不是转换。
System.Xml.XmlReader Reader;
Reader = System.Xml.XmlReader.Create(new StreamReader(Filename, Encoding.GetEncoding("UTF-8")));
XMLFile = XDocument.Load(Reader);
我用来实际提取节点信息的行是:
var classes = XMLFile.Root.Elements("class").Select(x => x);
这很棒,并且允许我完全按照我的需要提取信息。
只有这个法语(UTF-8)文本的格式化不能像我预期的那样工作。我做了一些研究,并抓住了另外两个功能来协助:
private string Decode(string Encoded)
{
System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
Byte[] Message = UTF8.GetBytes(Encoded);
return UTF8.GetString(Message);
}
private string Encode(string Original)
{
System.Text.ASCIIEncoding ASCII = new System.Text.ASCIIEncoding();
Byte[] Message = ASCII.GetBytes(Original);
return ASCII.GetString(Message);
}
这些似乎都没有任何区别。我在文本框中获得的只是Fr\\u00e9d\\u00e9ric
。
我错过了什么?请帮忙。
答案 0 :(得分:2)
\u00e9
是C#语法,而是在XML文件中使用é
。
但是,当您为XML文件指定UTF-8时,如果您的编辑器正确地将文件编码为UTF-8,则无需使用任何类型的转义,但您只需键入您想要的字符具有。例如。 Visual Studio:文件/高级保存选项。
答案 1 :(得分:0)
好的,这就是我最终做的事情:
string Filename = "";
string Author = "";
XDocument XMLFile;
System.Xml.XmlReader Reader;
Reader = System.Xml.XmlReader.Create(new StreamReader(Filename, Encoding.GetEncoding("UTF-8")));
XMLFile = XDocument.Load(Reader);
if (XMLFile.Root.Element("author") != null)
Author = Decode(XMLFile.Root.Element("author").Value);
魔法发生的地方......
private string Decode(string UnicodeString)
{
Regex DECODING_REGEX = new Regex(@"\\u(?<Value>[a-fA-F0-9]{4})", RegexOptions.Compiled);
string PLACEHOLDER = @"#!#";
return DECODING_REGEX.Replace(UnicodeString.Replace(@"\\", PLACEHOLDER),
m =>
{
return ((char)int.Parse(m.Groups["Value"].Value, NumberStyles.HexNumber)).ToString();
})
.Replace(PLACEHOLDER, @"\\");
}