python2和python3及ubuntu终端的编码问题

问题一:

在shell脚本中调用Python脚本时可能无法正常输出的问题
在ubuntu系统的shell脚本中调用python脚本时一直阻塞无法继续执行,ctrl + c结束进程后报错如下

error:  'ascii' codec can't encode characters in position 0-4: ordinal not in range(128)

错误分析:

该错误时原因是由于系统的语言编码设置,导致无法显示中文。

  • 解决方法1 可在运行脚本前,修改环境变量LANG或者PYTHONIOENCODING
export LANG="en_US.UTF-8"
或者
export PYTHONIOENCODING='utf-8'
  • 解决方法2 也可在python脚本中修改标准输出编码方式
import sys
import codecs
sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach())

拓展一: python的编码问题

在python2.7脚本默认编码是ascii码,该编码方式无法识别中文,因此一般会在脚本开头改变编码方式,如下:

#coding=utf-8
或者
## -*- coding: utf-8 -*-

将脚本的编码方式是改为utf-8,与python3一致。

  • 在计算机内存中,统一使用unicode编码,当需要保存到硬盘或者需要传输时,转换成utf-8编码,以此来节省存储空间。

  • Unicode编码格式:\u0000
    二进制编码格式(utf8, gbk):\x00\x00

  • 在python2.7中存在字符串,一种是unicode类型的:如s = u’中文’,一种是str类型: 如s = ‘中文’。Unicode类型的字符串可由str类型解码得来decode(),Unicode类型的字符串也可编码成str类型encode()。

在python2.7中做编码转换时通常需要以Unicode类型字符串为中介即:

str.decode('原编码格式').encode('目标编码格式')

decode():得到Unicode类型的字符串,
encode():将Unicode类型的字符串转换成其他编码。

python3中一般不存在这种问题。

你可能感兴趣的:(linux,ubuntu,python,linux)