无法将XML文件中的UTF-8格式文本加载到文本框(C#)

时间:2013-01-28 07:26:26

标签: c# xml unicode encoding utf-8

我有一个编码为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

我错过了什么?请帮忙。

2 个答案:

答案 0 :(得分:2)

\u00e9是C#语法,而是在XML文件中使用&#233;

但是,当您为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, @"\\");

    }