最后更新于 .

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

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

Pingbacks

Pingbacks已打开。

Trackbacks

引用地址

评论

  1. nov503

    nov503 on #

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

    Reply

  2. 依云

    依云 on #

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

    Reply

    1. Dante

      Dante on #

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

      Reply

  3. 明城

    明城 on #

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

    Reply

    1. Dante

      Dante on #

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

      Reply

  4. wlb5396340

    wlb5396340 on #

    是vim默认编码的问题吗

    Reply

    1. Dante

      Dante on #

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

      Reply

      1. Doyle

        Doyle on #

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

        Reply

        1. Dante

          Dante on #

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

          Reply

  5. 蛙蛙

    蛙蛙 on #

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

    Reply

    1. Dante

      Dante on #

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

      Reply

  6. 风间星魂

    风间星魂 on #

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

    Reply

    1. Dante

      Dante on #

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

      Reply

  7. 希锐亚

    希锐亚 on #

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

    Reply

    1. Dante

      Dante on #

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

      Reply

  8. GaoPP

    GaoPP on #

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

    Reply

  9. sky

    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

发表评论