none
Content-type 没有 charset 信息如何确定编码方式 RRS feed

  • 问题

  • 请教论坛上的大虾们,我用 System.Net.Http 下的相关类型登录和访问某个论坛,通过使用浏览器的开发者工具跟踪发现,此论坛的“响应头”中 Content-Type 的内容只有“text/html” 没有 charset 信息,我如何获取网页编码方式并正确解析?谢谢!!

    我现在的实现方式如下:

    responseMessage = await HttpClient.GetAsync( "http://www.a.com/index.html" );
    responseMessage.EnSuccessCode();
    System.IO.Steram stream = await responseMessage.Content.ReadAsStream();
    StreamReader reader = new StreamReader( stream,Encoding.GetEncoding("GBK") );
    string html = await reader.ReadToEndAsync();
    现在我知道网页编码是 GBK,所以我只能硬编码在里边。如果 Content-Type 没有 charset 信息,就无法在下载之前确定编码方式,如何处理才妥当呢。

    不重要的其实最重要

    2014年2月20日 2:19

答案

全部回复

  • 补充:

    看到网上有说,可以根据页面源代码里面的<meta http-equiv="Content-Type" content="text/html; charset=gbk">来判断编码方式,但这就需要将页面内容下载到本地之后才能查找判断,使用什么方式实现“不使用指定编码方式”的下载原始内容,下载后再判断呢?


    不重要的其实最重要

    2014年2月20日 2:39
  • 我使用过 IMultiLanguage2::DetectCodepageInIStream 方法,但是它并不总是正确,因为编码原理的问题,这类方法都有缺陷,你可以参考:http://stackoverflow.com/questions/90838/how-can-i-detect-the-encoding-codepage-of-a-text-file


    • 已编辑 Skyseer 2014年2月20日 2:40
    • 已标记为答案 试试手气 2014年2月20日 5:38
    2014年2月20日 2:40
  • http://www.cnblogs.com/TianFang/archive/2012/03/10/2389480.html

    請參考此篇。

    2014年2月20日 2:59
  • 我使用过 IMultiLanguage2::DetectCodepageInIStream 方法,但是它并不总是正确,因为编码原理的问题,这类方法都有缺陷,你可以参考:http://stackoverflow.com/questions/90838/how-can-i-detect-the-encoding-codepage-of-a-text-file


    非常感谢 DroidXgnaW 的快速帮助 ^^,而且你给的文章我也在看,非常好

    我现在的问题应该说,并不是要“猜测”某文本采用了什么编码,而是编码方式就写在文本里,但我下载到本地之前我肯定不知道,那我要用什么方式才能下载到原始数据呢?下载下来之后我通过什么方式读取和查找关键字?

    幸运的是,网页都是英文编写的,所以读取时候我可以先用 ascii 或 utf-8 编码方式读取,查找到<meta http-equiv="Content-Type" content="text/html; charset=gbk">,从而获得编码方式。但缺点就是,我需要读取两遍,这似乎有点儿效率低下了。

    但下载并保存到本地的时候怎么办,要保存成 byte[] 不成?


    不重要的其实最重要


    2014年2月20日 3:06
  • http://www.cnblogs.com/TianFang/archive/2012/03/10/2389480.html

    請參考此篇。

    感谢 David Kuo 的回复,我去学习一下

    不重要的其实最重要

    2014年2月20日 5:27
  • 暂时用以下方法解决了问题,但不知和成熟的“浏览器”产品相比,思路有什么缺陷

    1. Get 方法先请求页面,获得 Response 响应

    2. 查看响应头,如果 Content-Type 包含 charset 信息,则使用其制定编码(任务完成)

    3. 不包含 charset,则使用 StreamReader ,获取响应流

    4. StreamReader.ReadLine() 逐行读取,每一行都查找<meta http-equiv="Content-type'...>

    5. 如果找到(通常前 10 行就能找到),说明页面给出了正确读取的编码,停止继续读取

    6. 构造新的 StreamReader,完整的将页面内容用指定编码读取成字符串(显示或保存)

    7. 如果没找到(Meta里也没写),就默认使用 Encoding.Default 吧(纯蒙了)


    不重要的其实最重要

    2014年2月20日 5:37