全球主机交流论坛

标题: 一段百思不得其解的CURL代码(php代码) [打印本页]

作者: gftflb    时间: 2019-2-22 13:21
标题: 一段百思不得其解的CURL代码(php代码)
本帖最后由 gftflb 于 2019-2-22 13:49 编辑
  1. <?php
  2. $c = curl_init();
  3. curl_setopt($c, CURLOPT_URL,'http://www.xiasl.net/');
  4. curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
  5. curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
  6. curl_setopt($c, CURLOPT_HEADER, 1);
  7. $content = curl_exec($c);
  8. curl_close($c);
  9. $content=@str_replace('〗','',$content);  //请注意这行,这个字符为什么那么怪异,会对文本内容造成影响?
  10. echo $content;
  11. ?>
复制代码


大佬请运行下,看看为什么文本中“小-姐”这个词会莫名其妙的被修改?
只要替换“〗”这个字符,就会把内容中所有“小-姐”这个词,变成“秀”。百思不得其解。
大佬可以换其他含有“小-姐”这个词的网页url获取试试



替换“〗”的结果



不替换“〗”的结果

作者: 毒瘾    时间: 2019-2-22 13:27
太深奥 看不懂 替换
作者: 求道鱼    时间: 2019-2-22 13:40
提示: 作者被禁止或删除 内容自动屏蔽
作者: duxingfengyu    时间: 2019-2-22 13:43
单 替换,并没有小,姐,姐啊
作者: gftflb    时间: 2019-2-22 13:45
求道鱼 发表于 2019-2-22 13:40
在变量content 中搜索‘〗’ 并替换为空

只要替换“〗”这个字符,就会把内容中所有“小-姐”这个词,变成“秀”。
不替换“〗”这个字符,内容中“小-姐”这个词,就没有异样。
“〗”和“小-姐”有什么关系???????
百思不得其解。
作者: gftflb    时间: 2019-2-22 13:46
duxingfengyu 发表于 2019-2-22 13:43
单 替换,并没有小,姐,姐啊

只要替换“〗”这个字符,就会把内容中所有“小-姐”这个词,变成“秀”。
不替换“〗”这个字符,内容中“小-姐”这个词,就没有异样。
“〗”和“小-姐”有什么关系???????
百思不得其解。
作者: 查无此人    时间: 2019-2-22 13:48
提示: 作者被禁止或删除 内容自动屏蔽
作者: gftflb    时间: 2019-2-22 13:50
查无此人 发表于 2019-2-22 13:48
他是GBk,你是默认utf8。你先转一下字符集试试看

没用,试过了
作者: duxingfengyu    时间: 2019-2-22 13:51
https://baike.baidu.com/item/%E5%B0%8F%E5%A7%90/242562?fr=aladdin
一切正常

作者: testuserll    时间: 2019-2-22 13:55
为啥我执行就不替换啊,Windows 下用phpstudy试的。
作者: 似毛非毛    时间: 2019-2-22 14:03
阿里云虚拟主机上也没替换啊~~~直接复制的代码
作者: 0000000    时间: 2019-2-22 14:16
并不会把 〗 替小-姐
代码也没什么毛病.
作者: liuxu    时间: 2019-2-22 14:16
ubuntu,terminal编码改为gb2312,没你说的问题
作者: hdown    时间: 2019-2-22 15:32


就是
小,姐:d0a1 bde3
〗:a1bd
秀:d0e3

这是gbk编码不能正确判断每个汉字的开始结束的问题。
建议把网页先转成utf8,然后你php源代码也用utf8来写,就不会有此类问题了。
作者: 风雪hz    时间: 2019-2-22 15:33
这啥网站啊==
作者: gftflb    时间: 2019-2-22 16:39
hdown 发表于 2019-2-22 15:32
就是
小,姐:d0a1 bde3
〗:a1bd

哥你太牛了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
二个字——服!
作者: gftflb    时间: 2019-2-22 16:55
hdown 发表于 2019-2-22 15:32
就是
小,姐:d0a1 bde3
〗:a1bd

按照你解读的原理,终于解决了。

如果需要最终内容为gb2312编码的话,先把获取到的内容全部转成UTF-8编码,再进行过滤替换,最终再次进行编码转换为gb2312,就没这个灵异般的事情了。

大佬牛!

  1. <?php
  2. $c = curl_init();
  3. curl_setopt($c, CURLOPT_URL,'http://www.xiasl.net/');
  4. curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
  5. curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
  6. curl_setopt($c, CURLOPT_HEADER, 1);
  7. $content = curl_exec($c);
  8. curl_close($c);
  9. $content=mb_convert_encoding($content, 'UTF-8', 'GB2312');//先转UTF-8
  10. $content=@str_replace('〗','',$content); //进行替换
  11. $content=mb_convert_encoding($content, 'GB2312', 'UTF8');//再转回GB2312
  12. echo $content;
  13. ?>
复制代码

作者: hdown    时间: 2019-2-22 16:55
testuserll 发表于 2019-2-22 13:55
为啥我执行就不替换啊,Windows 下用phpstudy试的。

因为楼主是gb2312的php源码,你应该是utf-8的。所以你替换不到
作者: hdown    时间: 2019-2-22 17:23
gftflb 发表于 2019-2-22 16:55
按照你解读的原理,终于解决了。

如果需要最终内容为gb2312编码的话,先把获取到的内容全部转成UTF-8编 ...


1、不要滥用@,我从业这么多年,没有看到过哪个同事写代码用到@的。除了临时修复一些兼容性场景而不考虑可维护性。
2、如无必要,不要引入额外的依赖。就是说不要用mbstring扩展来转码,iconv自带函数用起来没什么问题。
3、始终使用utf8编码来写php源码。

第二点只是一个好习惯,不是什么必须遵守的。


作者: gftflb    时间: 2019-2-22 17:42
hdown 发表于 2019-2-22 17:23
1、不要滥用@,我从业这么多年,没有看到过哪个同事写代码用到@的。除了临时修复一些兼容性场景而不考虑 ...

多谢指点!
因为没系统学习过,我都是通过google东拼西凑的代码,有需求就拼揍,看起来能用就当作生产工具来用了。
经常为了一个小问题花上整天时间Google不断复制粘贴然后调试,有时候你们内行的一句话、一个指点真的非常可贵和难得。真心的。
再次感谢大佬!这论坛能遇上你真庆幸!




欢迎光临 全球主机交流论坛 (https://hostloc-workers.ikyomon.com/) Powered by Discuz! X3.4