[关闭]
@wzhang1117 2017-07-04T11:38:14.000000Z 字数 1019 阅读 3366

python终端编码问题解决

python 编码


print是python2.7最常用的语句之一,用于将字符串或unicode对象输出到屏幕,如果是字符串则直接输出,如果是unicode对象,则会先将其使用sys.stdout.encoding进行编码再输出。推荐使用print+unicode对象,这样可以确保系统对unicode进行正确的编码,如果使用print+已编码字符串,需要保证使用sys.stdout.encoding进行编码,否则不论是使用gbk或utf8进行硬编码都会导致一些跨平台的问题。

  1. # 下面的语句在win linux mac上都能正确执行
  2. print u'中文'
  3. # 下面的语句在windows下会打印乱码
  4. print u'中文'.encode('utf8')
  5. # 下面的代码在mac linux下会打印乱码
  6. print u'中文'.encode('gbk')

但是在windows下还有一类问题,就是要输出一个不在gbk编码中的字符时会导致编码异常。同理,输入时也会无法输入这种字符。

  1. # 因为在windows下,系统尝试将下面的unicode对象进行gbk编码,而©字符在gbk编码中根本不存在,因此无法编码
  2. print u'©2015 Baidu 使用百度前必读 意见反馈 京ICP证030173号'

最好的解决办法是pip install win-unicode-console

  1. import win_unicode_console
  2. win_unicode_console.enable()
  3. print u'©2015 Baidu 使用百度前必读 意见反馈 京ICP证030173号'
  4. u = raw_input(u'请输入©:')
  5. print type(u)

这里会到来一个副作用就是raw_input函数返回的结果为unicode对象,这就导致了跨平台情况下linux和mac通过raw_input返回字符串而通过windows返回的则是unicode,推荐下面的使用方式。

  1. import sys
  2. if sys.platform == 'win32':
  3. import win_unicode_console
  4. win_unicode_console.enable()
  5. input_unicode = raw_input
  6. else:
  7. def input_unicode(p=''):
  8. return raw_input(p).decode('utf8')
  9. u = input_unicode()
  10. print type(u) # unicode
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注