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](https://img-blog.csdnimg.cn/img_convert/a925e8059dc0c445c75f22c10eaf7dba.png)
str类型的本质是byte流(由编码方式决定实际值),unicode的本质是文本流(无关编码方式)。
![37e5ce592e0f51e7ba0d6d955f24dcd6.png](https://img-blog.csdnimg.cn/img_convert/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](https://img-blog.csdnimg.cn/img_convert/13c6d7e107698ccfbe4ca3bcda27bd13.png)
另外,在python3中,'xxx'默认就是unicode类型,也不再需要encode和decode进行转化。之前的str类型变成了byte类型。
如果你想进一步了解Linux中文细节,可以参考这篇文章。https://www.cnblogs.com/idlo/p/10427409.html