web-dev-qa-db-ja.com

C#でHTMLエンティティをUnicode文字に変換する

PythonとJavascriptについては同様の質問と回答が見つかりましたが、C#やその他のWinRT互換言語については見つかりませんでした。

必要だと思う理由は、Windows 8ストアアプリでWebサイトから取得したテキストを表示しているからです。例えば。 ééになります。

または、より良い方法がありますか? WebサイトやRSSフィードではなく、Webサイトとそのタイトルのリストのみを表示しています。

36
Remy

System.Net.WebUtility.HtmlDecodeおよび[〜#〜]の使用をお勧めしますnot [〜#〜]HttpUtility.HtmlDecode

これは、System.Web参照はWinforms/WPF/Consoleアプリケーションには存在せず、このクラスを使用してまったく同じ結果を得ることができます(すべてのプロジェクトで参照として既に追加されています)。

使用法:

string s =  System.Net.WebUtility.HtmlDecode("é"); // Returns é
64
Blachshma

これは便利な場合があり、すべての(私の要件に関する限り)エンティティを同等のUnicodeに置き換えます。

    public string EntityToUnicode(string html) {
        var replacements = new Dictionary<string, string>();
        var regex = new Regex("(&[a-z]{2,5};)");
        foreach (Match match in regex.Matches(html)) {
            if (!replacements.ContainsKey(match.Value)) { 
                var unicode = HttpUtility.HtmlDecode(match.Value);
                if (unicode.Length == 1) {
                    replacements.Add(match.Value, string.Concat("&#", Convert.ToInt32(unicode[0]), ";"));
                }
            }
        }
        foreach (var replacement in replacements) {
            html = html.Replace(replacement.Key, replacement.Value);
        }
        return html;
    }
11
zumey

HttpUtility.HtmlDecode()を使用します。msdnで読み取り ここ

decodedString = HttpUtility.HtmlDecode(myEncodedString)
7
Mudassir Hasan

MetroアプリとWP8アプリのHTMLエンティティとHTML番号の異なるコーディング/エンコード。

Windows Runtime Metroアプリを使用

_{
    string inStr = "ó";
    string auxStr = System.Net.WebUtility.HtmlEncode(inStr);
    // auxStr == &#243;
    string outStr = System.Net.WebUtility.HtmlDecode(auxStr);
    // outStr == ó
    string outStr2 = System.Net.WebUtility.HtmlDecode("&oacute;");
    // outStr2 == ó
}
_

Windows Phone 8.0の場合

_{
    string inStr = "ó";
    string auxStr = System.Net.WebUtility.HtmlEncode(inStr);
    // auxStr == &#243;
    string outStr = System.Net.WebUtility.HtmlDecode(auxStr);
    // outStr == &#243;
    string outStr2 = System.Net.WebUtility.HtmlDecode("&oacute;");
    // outStr2 == ó
}
_

これを解決するために、WP8では、System.Net.WebUtility.HtmlDecode()を呼び出す前に HTML ISO-8859-1リファレンス のテーブルを実装しました。

3
user1954682

これは私にとってはうまくいき、一般的なエンティティとユニコードエンティティの両方を置き換えます。

private static readonly Regex HtmlEntityRegex = new Regex("&(#)?([a-zA-Z0-9]*);");

public static string HtmlDecode(this string html)
{
    if (html.IsNullOrEmpty()) return html;
    return HtmlEntityRegex.Replace(html, x => x.Groups[1].Value == "#"
        ? ((char)int.Parse(x.Groups[2].Value)).ToString()
        : HttpUtility.HtmlDecode(x.Groups[0].Value));
}

[Test]
[TestCase(null, null)]
[TestCase("", "")]
[TestCase("&#39;fark&#39;", "'fark'")]
[TestCase("&quot;fark&quot;", "\"fark\"")]
public void should_remove_html_entities(string html, string expected)
{
    html.HtmlDecode().ShouldEqual(expected);
}
0
hcoverlambda

改善されたZumeyメソッド(そこでコメントできません)。最大文字サイズはエンティティにあります:&exclamation; (11)。エンティティの大文字も可能です。 À( wiki からのソース)

public string EntityToUnicode(string html) {
        var replacements = new Dictionary<string, string>();
        var regex = new Regex("(&[a-zA-Z]{2,11};)");
        foreach (Match match in regex.Matches(html)) {
            if (!replacements.ContainsKey(match.Value)) { 
                var unicode = HttpUtility.HtmlDecode(match.Value);
                if (unicode.Length == 1) {
                    replacements.Add(match.Value, string.Concat("&#", Convert.ToInt32(unicode[0]), ";"));
                }
            }
        }
        foreach (var replacement in replacements) {
            html = html.Replace(replacement.Key, replacement.Value);
        }
        return html;
    }
0
EminST