python子进程调用casperjs中文乱码

来源:互联网 发布:剑灵大地力士卡刀数据 编辑:程序博客网 时间:2024/05/17 04:48

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

背景:

win7-64  python2.7   casperjs1.3beta  phantomjs2.0.0

问题现象:在python中用subprocess调用cmd执行casperjs,返回的内容中文乱码


解决过程:

乱码问题很蛋疼,特别是涉及到字节流在代码中穿过来穿过去那种,把每一次in和out都看做过一道门的话,那在每一道门都有可能出问题,然后需要你在那么多道们中找到出问题的那一个。。。

1)简化问题

     先撇开subprocess的调用,直接在cmd窗口中分别调用phantom 和casperjs来获取页面内容

     多次实验证明phantom在cmd下没问题(显示是乱码,但转码为utf-8的时候正常),而casperjs则会出现乱码(显示是乱      码,但转码为utf-8的时候还存在乱码字符)

     找到一篇文章http://mushanblog.com/blog/study-note-of-casperjs

     按照里面的修改,casperjs在cmd窗口输出正常了

     修改项:

1.把cmd编码改为utf-8 命令-----CHCP 65001   

                2.修改窗口属性,改变字体在命令行标题栏上点击右键,选择"属性"->"字体",将字体修改为True Type字体"Lucida

           Console",然后点击确定将属性应用到当前窗口。

2)再结合subprocess(popen的stdout设置为PIPE)

     我觉得cmd的属性配置应该是全局的吧,因为我打开不同个cmd窗口可以看出配置都一样了。但用subprocess的popen调用还      是乱码。然后我就想那就用popen来改下cmd的编码吧,测试后成功了。

     具体代码:

         subprocess.Popen(["cmd", "/c",                           """chcp 65001"""]) #新加部分         proc = subprocess.Popen(["cmd", "/c", ………………#具体业务代码

    最后,还有几个问题请教下路过的大神们

         1)为什么修改了cmd的编码方式,但通过管道通信的时候还需要再设置一次。。。

         2)这个popen的PIPE通信具体是怎么回事,比如我调用的是cmd程序,那所有发到cmd显示的内容都当做PIPE的输入?

            像网上一些通信例子,都是直接自己显示申请的PIPE然后一端写,一端读。。。那其他的这种调用第三方程序这一类    的,他是怎么确定第三方程序的返回值的(比如有些程序是把数据直接写入内存然后返回0或1的状态吗),然后再打入    到popen的stdout指定的管道(不知道我说明白了没有)?

0 0