前一段时间在博客中和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

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

暂无相关产品

17则回应给“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的,可能可以解释这个问题。

    [回复]

  8. GaoPP说道:

    CheckPythonSyntax 中把copen换成clist感觉更加好使,光标还会保留在当前窗口

    [回复]

  9. sky说道:

    楼主的一键运行挺好用的,收走啦。我的输出正常,就没去改动控制台输出编码。
    不过若出现问题,可尝试用以下方法解决
    ” 解决quickfix输出乱码
    “function QfMakeConv()
    ” let qflist = getqflist()
    ” for i in qflist
    ” let i.text = iconv(i.text, “cp936″, “utf-8″)
    ” endfor
    ” call setqflist(qflist)
    “endfunction
    “au QuickfixCmdPost make call QfMakeConv()

    [回复]

发表评论