• CURL编程:什么是NonASCII平台,如何取得页面的charset


    在做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错了呗。
  • 相关阅读:
    c++ vector容器的使用,序列倒叙reverse(),容器底部插入一个数值push_back()
    vs2015+opencv-3.2.0-vc14配置
    串的匹配算法--C语言实现
    顺序队列与链式队列--C语言实现
    链式栈-C语言实现
    顺序栈与两栈共享空间-C语言实现
    静态链表-C语言实现
    循环双向链表-C语言实现
    链表-C语言实现
    顺序表-C语言实现
  • 原文地址:https://www.cnblogs.com/super119/p/1996109.html
Copyright © 2020-2023  润新知