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()
结果如下:
但如果直接在vim中调用:
:!python %
结果如下:
由此可见,是Vim在获取输出的时候出了问题,并非print不能输出decode之后的数据。
以上的结果是在windows下测试的,在linux下也是一样的结果,但是上图的乱码在linux是正常的,在linux下执行结果如下:
目前还没有找到什么好的解决办法,不知道大家是否有相应的解决方案~~
原创文章,版权所有。转载请注明:转载自Vimer的程序世界 [ http://www.vimer.cn ]
本文链接地址: http://www.vimer.cn/?p=1403
沙发,嘿嘿!对python暂没研究。。
[回复]
stdout 的编码问题?貌似和我在 cgi 环境下是类似的问题。
[回复]
Dante 回复:
七月 14th, 2010 at 10:09 下午
呃,依云倒是提醒我了,确实有可能是stdout的问题,不过还是没有找到解决的方法……
[回复]
觉得应该是 Windows 得内码问题,针对 Windows 转码试试看,因为以前我在 Windows 下使用中文字体的时候碰到过这样的问题。
[回复]
Dante 回复:
七月 14th, 2010 at 10:07 下午
windows下直接执行没有问题哦,是vim托管输出的时候有问题~
[回复]
是vim默认编码的问题吗
[回复]
Dante 回复:
七月 14th, 2010 at 10:06 下午
呃,应该不是,我在vimrc里面设置了:
set encoding=utf-8
[回复]
Doyle 回复:
七月 29th, 2010 at 11:22 上午
win下面默认编码是cp936吧。。。用utf-8会有问题
[回复]
Dante 回复:
七月 31st, 2010 at 10:52 上午
倒是有这种可能~~,不过奇怪的是在windows下直接用就没有问题,只有用vim输出的时候有问题。。
[回复]
python,学的半途而废。看来得补修一下。
Vim是好东西,正在进步中。。
[回复]
Dante 回复:
八月 14th, 2010 at 6:49 下午
哈哈,现在最喜欢的就是python啦,最喜欢的编辑器是vim,vim又原生支持python脚本,真是天作之合啊
[回复]
这个问题很简单,windows下的控制台编码是gbk,vim是utf-8,你在py里把编码从gbk转到utf-8在vim的输出就正常了。
[回复]
Dante 回复:
八月 26th, 2010 at 3:53 下午
呃,不行的,不管是decode成
utf8还是gbk,都会报错。
[回复]
加上
print chinese.decode(‘utf-8′).encode(‘cp936′)
[回复]
Dante 回复:
九月 23rd, 2010 at 1:46 上午
encode之后是一定不会报错的,不管是encode成什么编码。
最近有看过一篇文章说过,在python里,命令之间传递的数据必须是encode的,可能可以解释这个问题。
[回复]