0

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

我错过了什么?请帮忙。

4

2 回答 2

2

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

但是,当您为 XML 文件指定 UTF-8 时,如果您的编辑器将文件正确编码为 UTF-8,则无需使用任何类型的转义,但您可以简单地键入您想要的字符。例如 Visual Studio:文件/高级保存选项。

于 2013-01-28T07:52:04.957 回答
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, @"\\");

    }
于 2014-01-05T10:33:58.530 回答