C#解码非Ascii字符?

时间:2017-04-18 19:36:56

标签: c# decode encode non-ascii-characters

我正在使用HtmlAgilityPack从几个网站阅读元描述。

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

我正在使用编码UTF8 - 我应该使用别的东西。

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

2 个答案:

答案 0 :(得分:1)

WebClient.DownloadString是一种有限的高级方法,它使得从根本上简单的事情变得笨拙和容易出错。

通过HTTP获取网页很简单。您提供了一个URL和一些请求标头;服务器响应一些响应头和正文的字节流。响应头通常表示文本主体的字符编码。如果没有,文本正文可能会说自己。 HTMLAgilityPack理解这一点并提供HtmlWeb类来从该交互创建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)

答案 1 :(得分:0)

根据您的评论,您的网站似乎使用的是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。

enter image description here

调试器的屏幕截图#2。

enter image description here