设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 1926|回复: 0
打印 上一主题 下一主题

【原创】判断网页编码的五种解法

[复制链接]
跳转到指定楼层
1#
发表于 2014-2-25 09:19:06 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 faunus 于 2014-2-25 09:20 编辑

(这些都不是最完美的,那个研究中...)

(1)原始方案
System.Text.Encoding.Default
采用当前的默认编码,可以解决大部分问题,但是很多跟情况下同样会出错。

(2)HTTPWebrequest 的CharacterSet(MSND上给的方案,本来应该的做法)
该属性可以返回该网站编码,但是总为空。

(3)老外的解决之道
Sven Groot
I came across a very silly (and annoying) bug in the HttpWebResponse.CharacterSet property. Let's see if you can spot it (code extracted with reflector):

  1. public string get_CharacterSet()
  2. {
  3.   this.CheckDisposed();
  4.   string text1 = this.m_HttpResponseHeaders.ContentType;
  5.   if ((this.m_CharacterSet == null) && !ValidationHelper.IsBlankString(text1))
  6.   {
  7.     this.m_CharacterSet = string.Empty;
  8.     string text2 = text1.ToLower(CultureInfo.InvariantCulture);
  9.     if (text2.Trim().StartsWith("text/"))
  10.     {
  11.       this.m_CharacterSet = "ISO-8859-1";
  12.     }
  13.     int num1 = text2.IndexOf(";");
  14.     if (num1 > 0)
  15.     {
  16.       while ((num1 = text2.IndexOf("charset", num1)) >= 0)
  17.       {
  18.         num1 += 7;
  19.         if ((text2[num1 - 8] == ';') || (text2[num1 - 8] == ' '))
  20.         {
  21.           while ((num1 < text2.Length) && (text2[num1] == ' '))
  22.           {
  23.             num1++;
  24.           }
  25.           if ((num1 < (text2.Length - 1)) && (text2[num1] == '='))
  26.           {
  27.             num1++;
  28.             int num2 = text2.IndexOf(';', num1);
  29.             if (num2 > num1)
  30.             {
  31.               this.m_CharacterSet = text1.Substring(num1, num2).Trim();
  32.               break;
  33.             }
  34.             this.m_CharacterSet = text1.Substring(num1).Trim();
  35.             break;
  36.           }
  37.         }
  38.       }
  39.     }
  40.   }
  41.   return this.m_CharacterSet;
  42. }
复制代码


(4)另一种方法(先获取内容,再根据内容来判)
  1. static
  2. string GetHtml(string url, Encoding encoding)  {    byte[] buf =
  3. new WebClient().DownloadData(url);    if (encoding !=
  4. null) return encoding.GetString(buf);    string html = Encoding.UTF8.GetString(buf);    encoding = GetEncoding(html);    if (encoding ==
  5. null
  6. || encoding == Encoding.UTF8) return html;    return encoding.GetString(buf);  }
复制代码


(5)结合3/4的办法(当然去看HttpWebResponse函数的源代码了)
//得到CharacterSet
  1. private
  2. string getEncoding (HttpWebResponse httpResp)
  3. {
  4. string contentType = httpResp.ContentType ;
  5. int i = contentType.IndexOf("charset=");
  6. if (i>=0)   {   i +=
  7. 8;
  8. int j = contentType.IndexOf(';', i);
  9. if (j>=i)   {
  10. return contentType.Substring(i,j-i).Trim();   }
  11. return contentType.Substring(i); }
  12. return
  13. string.Empty;}
复制代码

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-11-1 15:33 , Processed in 0.086029 second(s), 25 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表