在做DealSpider的时候,必须要知道页面的charset,然后转成UTF-8,最后才能用glib的正则表达式来进行匹配和搜索。CURL本身 是不提供这样的功能的,之前在curl_easy_setopt的man手册中看到了:CURLOPT_CONV_TO_NETWORK, CURLOPT_CONV_FROM_NETWORK,以为这两个可以自动进行转码,后来发现是不行的。这两个仅仅是用于non-ascii平台的。
什 么是Non-ASCII平台?简答来说,就是不是所有的计算机系统都用ASCII码的,比如IBM的mainframe机器。在这种机器上,由于不使用 ASCII码,而像http, ftp这些文本协议必须要使用ASCII码,所以就存在一个转换的问题。这两个选项是作这个用途的,不是做charset转换的。
有关这个问题再参考一下老外给的回答:
> I wanna convert all http responses to UTF-8 because, you know, not all
> web pages are written in UTF-8. I skimmed the manual of "curl_easy_setopt",
> seems "CURLOPT_CONV_TO_NETWORK_FUNCTION",
> "CURLOPT_CONV_FROM_NETWORK_FUNCTION" do helps.
Not really. The purpose of that functionality is for platforms that do not
speak ASCII natively to provide a way to make the protocols we use that are
ascii-based to still work fine.
有关non-ascii平台的问题,这个WIKI里面说的很清楚:http://en.wikipedia.org/wiki/Extended_Binary_Coded_Decimal_Interchange_Code
所 以,回到问题上来,如果要取charset,可以考虑在HTTP的response header中取到。这样的话,只需要curl_easy_setopt,重载HEADERFUNCTION,然后就有这样的内容:"Content- Type: text/html; charset=UTF-8"。
不过有些时候,header中的charset不一定就是最后取到 HTML的charset。HTML里面有个meta标记,也可以定义charset,但其实这也不一定准。而且为了去分析HTML里面的内容,就需要预 先知道charset。所以,很多人也在建议,应该有一个根据byte来判断charset的函数,这样最科学一些。不过就如Joel说 的,charset没有固定的规律,所以charset detection也大多是根据一些经验,也不是100%准的。所以这个事情其实是没有完美解决方案的,charset detection只是一种最好的方法。这就是为什么IE,Firefox有的时候显示页面也会出现乱码的原因 ---- 就是charset自动detection错了呗。
什 么是Non-ASCII平台?简答来说,就是不是所有的计算机系统都用ASCII码的,比如IBM的mainframe机器。在这种机器上,由于不使用 ASCII码,而像http, ftp这些文本协议必须要使用ASCII码,所以就存在一个转换的问题。这两个选项是作这个用途的,不是做charset转换的。
有关这个问题再参考一下老外给的回答:
> I wanna convert all http responses to UTF-8 because, you know, not all
> web pages are written in UTF-8. I skimmed the manual of "curl_easy_setopt",
> seems "CURLOPT_CONV_TO_NETWORK_FUNCTION",
> "CURLOPT_CONV_FROM_NETWORK_FUNCTION" do helps.
Not really. The purpose of that functionality is for platforms that do not
speak ASCII natively to provide a way to make the protocols we use that are
ascii-based to still work fine.
有关non-ascii平台的问题,这个WIKI里面说的很清楚:http://en.wikipedia.org/wiki/Extended_Binary_Coded_Decimal_Interchange_Code
所 以,回到问题上来,如果要取charset,可以考虑在HTTP的response header中取到。这样的话,只需要curl_easy_setopt,重载HEADERFUNCTION,然后就有这样的内容:"Content- Type: text/html; charset=UTF-8"。
不过有些时候,header中的charset不一定就是最后取到 HTML的charset。HTML里面有个meta标记,也可以定义charset,但其实这也不一定准。而且为了去分析HTML里面的内容,就需要预 先知道charset。所以,很多人也在建议,应该有一个根据byte来判断charset的函数,这样最科学一些。不过就如Joel说 的,charset没有固定的规律,所以charset detection也大多是根据一些经验,也不是100%准的。所以这个事情其实是没有完美解决方案的,charset detection只是一种最好的方法。这就是为什么IE,Firefox有的时候显示页面也会出现乱码的原因 ---- 就是charset自动detection错了呗。