CURL编程:什么是Non-ASCII平台,如何取得页面的charset
2011-03-26 09:59
148 查看
在做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错了呗。
相关文章推荐
- 为何要学编程?如何学编程?用什么语言最好?有什么好书?
- 在用R语言编程中,界面上出现了“+”号,是什么意思?如何删除错误的输入,如何清屏?
- 第2章 Java编程基础——FAQ2.07 final关键字有什么含义?具体如何应用?
- centos shell编程5 LANMP一键安装脚本 lamp sed lnmp 变量和字符串比较不能用-eq cat > /usr/local/apache2/htdocs/index.php <<EOF重定向 shell的变量和函数命名不能有横杠 平台可以用arch命令,获取是i686还是x86_64 curl 下载 第三十九节课
- 如何在eclipse中更改jsp页面的charset以解决中文乱码问题
- 如何解决android平台中页面无法自适应
- 数据库中有的字段为null时,反馈到页面上是什么也不显示?如何用一个【无】字来代替呢?
- Web编程 > HTML/WML/CSS兼容/XML > 如何强制360浏览器以极速模式打开页面
- 第2章 Java编程基础——FAQ2.06 static关键字有什么含义?具体如何应用?能修饰构造方法吗?
- 把 Script 标签 放在页面的最底部的 body 封闭之前 和封闭之后有什么区别?浏览器会如何解析它们?
- Ext JS中如何从grid页面取得cloumns中的数据
- 汉字编码与编程相关问题总结:ASCII、机内码、区位码、国标码、Unicode码是如何转换的
- 如何取得职业的进步? & 我们mark来mark去究竟m到了什么?
- php 如何让curl不在页面上显示
- 【轉】COM编程入门 第一部分——什么是COM,如何使用COM
- win10终端如何使用curl命令来抓取页面源码和内容
- 到底如何区分什么是架构、框架、模式和平台 ?
- iOS编程--------网络编程 iOS平台如何实现HTTP协议请求
- 关于如何在继承母版页的页面取得母版页上的控件的方法
- 编程,如何编程,什么是编程