vim(gvim)一键执行python脚本的bug

前一段时间在博客中和fuadam讨论过python中调用print的时候,是否可以直接打印decode之后的字符的问题。(原文:python-django的中文编码总结)
一开始我的结论是,print只能打印encode的字符,不能进行decode,但是后来在直接执行python test.py(在vim中是!python %)后,发现确实能够正常打印,那我之前究竟是怎么看到错误的结果的呢?

首先,我们需要在vimrc中做如下配置来实现python的一键执行:

function CheckPythonSyntax()
    let mp = &makeprg
    let ef = &errorformat
    let exeFile = expand("%:t")
    setlocal makeprg=python\ -u
    set efm=%C\ %.%#,%A\ \ File\ \"%f\"\\,\ line\ %l%.%#,%Z%[%^\ ]%\\@=%m
    silent make %
    copen
    let &makeprg     = mp
    let &errorformat = ef
endfunction

打开一个python文件,代码如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-
x = '我爱你'
print x
print x.decode('utf-8')

在vim中调用:

:call CheckPythonSyntax()

结果如下:

1

但如果直接在vim中调用:

:!python %

结果如下:

2

由此可见,是Vim在获取输出的时候出了问题,并非print不能输出decode之后的数据。

以上的结果是在windows下测试的,在linux下也是一样的结果,但是上图的乱码在linux是正常的,在linux下执行结果如下:

 3

目前还没有找到什么好的解决办法,不知道大家是否有相应的解决方案~~





原创文章,版权所有。转载请注明:转载自Vimer的程序世界 [ http://www.vimer.cn ]

本文链接地址: http://www.vimer.cn/?p=1403

15 个评论 在 “vim(gvim)一键执行python脚本的bug”

  1. nov503 说:

    沙发,嘿嘿!对python暂没研究。。

    [回复]

  2. 依云 说:

    stdout 的编码问题?貌似和我在 cgi 环境下是类似的问题。

    [回复]

    Dante 回复:

    呃,依云倒是提醒我了,确实有可能是stdout的问题,不过还是没有找到解决的方法……

    [回复]

  3. 明城 说:

    觉得应该是 Windows 得内码问题,针对 Windows 转码试试看,因为以前我在 Windows 下使用中文字体的时候碰到过这样的问题。

    [回复]

    Dante 回复:

    windows下直接执行没有问题哦,是vim托管输出的时候有问题~

    [回复]

  4. wlb5396340 说:

    是vim默认编码的问题吗

    [回复]

    Dante 回复:

    呃,应该不是,我在vimrc里面设置了:
    set encoding=utf-8

    [回复]

    Doyle 回复:

    win下面默认编码是cp936吧。。。用utf-8会有问题

    [回复]

    Dante 回复:

    倒是有这种可能~~,不过奇怪的是在windows下直接用就没有问题,只有用vim输出的时候有问题。。

    [回复]

  5. 蛙蛙 说:

    python,学的半途而废。看来得补修一下。
    Vim是好东西,正在进步中。。

    [回复]

    Dante 回复:

    哈哈,现在最喜欢的就是python啦,最喜欢的编辑器是vim,vim又原生支持python脚本,真是天作之合啊

    [回复]

  6. 风间星魂 说:

    这个问题很简单,windows下的控制台编码是gbk,vim是utf-8,你在py里把编码从gbk转到utf-8在vim的输出就正常了。

    [回复]

    Dante 回复:

    呃,不行的,不管是decode成
    utf8还是gbk,都会报错。

    [回复]

  7. 希锐亚 说:

    加上
    print chinese.decode(‘utf-8′).encode(‘cp936′)

    [回复]

    Dante 回复:

    encode之后是一定不会报错的,不管是encode成什么编码。
    最近有看过一篇文章说过,在python里,命令之间传递的数据必须是encode的,可能可以解释这个问题。

    [回复]

我要评论

*

*