前一段时间在博客中和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下执行结果如下:
目前还没有找到什么好的解决办法,不知道大家是否有相应的解决方案~~
nov503 on #
沙发,嘿嘿!对python暂没研究。。
Reply
依云 on #
stdout 的编码问题?貌似和我在 cgi 环境下是类似的问题。
Reply
Dante on #
呃,依云倒是提醒我了,确实有可能是stdout的问题,不过还是没有找到解决的方法……
Reply
明城 on #
觉得应该是 Windows 得内码问题,针对 Windows 转码试试看,因为以前我在 Windows 下使用中文字体的时候碰到过这样的问题。
Reply
Dante on #
windows下直接执行没有问题哦,是vim托管输出的时候有问题~
Reply
wlb5396340 on #
是vim默认编码的问题吗
Reply
Dante on #
呃,应该不是,我在vimrc里面设置了:
set encoding=utf-8
Reply
Doyle on #
win下面默认编码是cp936吧。。。用utf-8会有问题
Reply
Dante on #
倒是有这种可能~~,不过奇怪的是在windows下直接用就没有问题,只有用vim输出的时候有问题。。
Reply
蛙蛙 on #
python,学的半途而废。看来得补修一下。
Vim是好东西,正在进步中。。
Reply
Dante on #
哈哈,现在最喜欢的就是python啦,最喜欢的编辑器是vim,vim又原生支持python脚本,真是天作之合啊
Reply
风间星魂 on #
这个问题很简单,windows下的控制台编码是gbk,vim是utf-8,你在py里把编码从gbk转到utf-8在vim的输出就正常了。
Reply
Dante on #
呃,不行的,不管是decode成
utf8还是gbk,都会报错。
Reply
希锐亚 on #
加上
print chinese.decode('utf-8').encode('cp936')
Reply
Dante on #
encode之后是一定不会报错的,不管是encode成什么编码。
最近有看过一篇文章说过,在python里,命令之间传递的数据必须是encode的,可能可以解释这个问题。
Reply
GaoPP on #
CheckPythonSyntax 中把copen换成clist感觉更加好使,光标还会保留在当前窗口
Reply
sky on #
楼主的一键运行挺好用的,收走啦。我的输出正常,就没去改动控制台输出编码。
不过若出现问题,可尝试用以下方法解决
" 解决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()
Reply