中文 python_Linux与Python中文编码详解

TL;DR:

Linux乱码

(如果之前没安装过)yum groupinstall chinese-support

vim /etc/sysconfig/i18n

将LANG="Zn_CN.UTF-8"复制到末尾

vim乱码

step1:在控制台输入 vim /etc/vimrc

step2:将下面三行复制到文件末尾

set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936
set termencoding=utf-8
set encoding=utf-8

终端乱码

在终端设置里修改编码,和Linux端保持一致。

python报错:Non-ASCII character:

在python文件第一行加:#coding=utf-8

python2报错:UnicodeEncodeError 'ascii' codec can't encode character

这个问题一般是print出现的,

print str → print str.encode('utf-8')

json:Expecting , delimiter: line 1 column xxx

如果你确定json是正确的这个问题一般是由于采用了错误的decode方式,比如说

文本file是utf-8编码,在读取时:

for line in file:

line = line.decode('gbk','ignore')

json.loads(line)

解决方案是:不要设置ignore,多试几种解码方式(utf-8,gbk),直到不ignore也可以成功decode。

分析

文本文件的本质是二进制数码(硬盘,内存中),不同的编码方式,规定了它展示的方法。

拿python的两个报错来说:

  • Non-ASCII character
  • UnicodeEncodeError 'ascii' codec can't encode character

Non-ASCII character

xxx.py文件本身是一堆二进制代码,它以特定的方式被解码,然后被解释器分析。

str = unicode('中国', 'utf-8')

上面的这个程序会报错,因为python默认的解码方式是ascii(可以用sys.getdefaultencoing()查看),而'中国'没办法被ascii解码,报错:Non-ASCII character

通过添加:#coding=utf-8,指定了该文件的解码方式,解决这个错误。

UnicodeEncodeError

解决了**Non-ASCII character之后,**程序已经能够被分析了。

在python内部(2.x版本),存在着两种字符串表示,str和unicode。

#coding=utf-8
s = '中国'
u = u'中国人'
print type(s)
print type(u)
print s
print u

a925e8059dc0c445c75f22c10eaf7dba.png

str类型的本质是byte流(由编码方式决定实际值),unicode的本质是文本流(无关编码方式)。

37e5ce592e0f51e7ba0d6d955f24dcd6.png

在这个程序里,字符串s是str类型,并且以utf-8的形式储存(因为设置了coding=utf-8),print时,直接打印到Linux终端,Linux以utf-8解码,正常输出。

对于字符串u来说,声明成了unicode类型,在print时必须encode,而没有因为没有指定encode方法,使用sys.stdout.encoding,在我这里是ascii类型,所以报错UnicodeEncodeError。

解决办法就是指定encode为utf-8

#coding=utf-8
s = '中国'
u = u'中国人'
print type(s)
print type(u)
print s
print u.encode('utf-8)

13c6d7e107698ccfbe4ca3bcda27bd13.png

另外,在python3中,'xxx'默认就是unicode类型,也不再需要encode和decode进行转化。之前的str类型变成了byte类型。

如果你想进一步了解Linux中文细节,可以参考这篇文章。https://www.cnblogs.com/idlo/p/10427409.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值