积极答复者
Content-type 没有 charset 信息如何确定编码方式

问题
-
请教论坛上的大虾们,我用 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 信息,就无法在下载之前确定编码方式,如何处理才妥当呢。
不重要的其实最重要
答案
全部回复
-
我使用过 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:08
-
暂时用以下方法解决了问题,但不知和成熟的“浏览器”产品相比,思路有什么缺陷
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 吧(纯蒙了)
不重要的其实最重要