使用Curl进行抓取远程内容时url中文编码问题
PHP中对于URL进行编码,可以使用 urlencode() 或者 rawurlencode(),二者的区别是前者把空格编码为 '+',而后者把空格编码为 '%20',不过应该注意的是,在编码时应该只对部分URL编码,否则URL中的冒号和反斜杠也会被转义。下面是详细解释:
1
|
string urlencode( string str) |
返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。
例子 1 :urlencode函数与rawurlencode函数区别
1
2
3
4
|
$str = '博 客' ; echo urlencode( $str ); echo "<br>" ; echo rawurlencode( $str ); |
url结果:
1
2
|
%B2%A9+%BF%CD %B2%A9%20%BF%CD |
例子 2 :url中文编码方法
从url:"http://www.baidu.com/s?wd=博 客" 转为 url:"http://www.baidu.com/s?wd=%E5%8D%9A%20%E5%AE%A2";
1
2
3
4
|
$url = 'http://www.baidu.com/s?wd=博
客' ; $arr = explode ( '=' , $url ); $url = $arr [0]. '=' .rawurlencode( $arr [1]); echo $url ; |
结果:
http://www.baidu.com/s?wd=%E5%8D%9A%20%E5%AE%A2
或许用以下url编码函数
1
2
3
4
5
6
7
8
9
10
11
12
|
function cn_urlencode( $url ){ $pregstr = "/[\x{4e00}-\x{9fa5}]+/u" ; //UTF-8中文正则 if (preg_match_all( $pregstr , $url , $matchArray )){ //匹配中文,返回数组 foreach ( $matchArray [0] as $key => $val ){ $url = str_replace ( $val ,
urlencode( $val ), $url ); //将转译替换中文 } if ( strpos ( $url , '
' )){ //若存在空格 $url = str_replace ( '
' , '%20' , $url ); } } return $url ; } |
url结果:
http://www.baidu.com/s?wd=%E5%8D%9A%20%E5%AE%A2
作者:Wicub
免责声明:文章、笔记等仅供分享、探讨、参考等学习之用,因此造成的任何后果概不负责。(如有错误、疏忽等问题,欢迎指正、讨论,谢谢)
本文版权归作者和博客园共有,欢迎转载,但请务必在文章页面明显位置给出原文连接,谢谢配合。