0

UTF-8としてエンコードされたXMLファイルがあります。

<?xml version="1.0" encoding="UTF-8"?>

Unicodeが埋め込まれているノードが1つあります。これは、フランス語(およびその他の)文字を保持するためです。

<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)テキストのフォーマットのみです。私はいくつかの調査を行い、支援するために他の2つの機能を取得しました。

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 に答える