C# 解码非 Ascii 字符?

C# decoding non Ascii characters?

我正在阅读来自几个使用 HtmlAgilityPack 的站点的元描述。

我注意到如果它不是英文字母,它不会解码特殊字符。 (例如日本字母)。

我正在使用编码 UTF8 - 我应该使用其他东西吗?

byte[] bytes = Encoding.Default.GetBytes(item.Attributes["content"].Value);
return Encoding.UTF8.GetString(bytes);

根据您的评论,您的网站似乎使用的是 SHIFT-JIS 编码,而不是 UTF-8。我为 UTF-8 和 SHIFT-JIS 添加了两个示例。

        using (var client = new WebClient())
        {
            // UTF-8
            var content = client.DownloadString("http://www3.nhk.or.jp/news/");
            var doc = new HtmlDocument();
            doc.LoadHtml(content);
            var metaDescNode = doc.DocumentNode.SelectSingleNode("//meta[@name=\"description\"]");
            var bytes = Encoding.Default.GetBytes(metaDescNode.Attributes["content"].Value);
            var decodedMetaDesc = Encoding.UTF8.GetString(bytes); // This string has decoded characters

            // Shift_JIS
            var japaneseEncoding = Encoding.GetEncoding(932); 
            var content2 = client.DownloadString("http://www.toronto-electricians.com/");
            var doc2 = new HtmlDocument();
            doc2.LoadHtml(content2);
            var metaDescNode2 = doc2.DocumentNode.SelectSingleNode("//meta[@name=\"description\"]"); 
            var bytes2 = Encoding.Default.GetBytes(metaDescNode2.Attributes["content"].Value);
            var decodedMetaDesc2 = japaneseEncoding.GetString(bytes2); // This string has decoded characters
        }

来自调试器的屏幕截图 #1。

来自调试器的屏幕截图 #2。

WebClient.DownloadString 是一种有限的 high-level 方法,这使得它变得笨拙并且 error-prone 做基本简单的事情。

通过 HTTP 获取网页很简单。你给了一个 URL 和一些请求 headers;服务器用一些响应 headers 和 body 的字节流进行响应。响应 headers 通常说明文本的字符编码 body。如果不是,文本 body 可能会自己说。 HTMLAgilityPack 了解这一点并提供 HtmlWeb class 来从该交互中创建一个 HtmlAgilityPack.HtmlDocument。

var document = new HtmlWeb().Load("http://www3.nhk.or.jp/news/");
var keywords = document.DocumentNode
    .SelectSingleNode("//meta[@name='keywords']")
    .Attributes["content"]?.Value;
Console.WriteLine(keywords);
Console.WriteLine($@"
  StreamEncoding:   {document.StreamEncoding?.EncodingName}
  DeclaredEncoding: {document.DeclaredEncoding?.EncodingName}
  Encoding:         {document.Encoding?.EncodingName}");

NHK,ニュース,NHK NEWS WEB

  StreamEncoding:   Unicode (UTF-8)
  DeclaredEncoding: 
  Encoding:         Unicode (UTF-8)