在windows下 gbk,linux下utf-8注意事项

问题描述:
大部分国人的windows操作系统上都是GB2312,而在Linux上的默认编码都是utf-8。
所以在进行编码,解码的时候要注意了,在windows下
在cmd中输入chcp可以看到

活动代码页:936

936 代表 中国 - 简体中文(GB2312)

在linux下查看字符集

locale

在cmd中敲如下命令

python
str = '中文'
str.decode(‘gbk’)

这个不会报错,因为在windows下使用的编码集是GB2312,当我们尝试以GBK(GB2312的扩展)这个编码集去解码字符串str成unicode的时候,不会报错,因为,使用了正确的编码集去解码字符串

但是同样的代码在系统默认编码为utf-8的操作系统中(例如linux的系统都是默认是utf-8的)就会报错

在Linux的bash中敲如下命令

python
str = '中文'
str.decode(‘gbk’)
Traceback (most recent call last):
  File "", line 1, in 
UnicodeDecodeError: 'gbk' codec can't decode bytes in position 2-3: illegal multibyte sequence

因为linux下默认的编码集是utf-8,所以linux内部的字符串从一开始被声明就以utf-8的编码方式进行了编码,就相当于字符串的每一个字符都被映射到了utf-8中的特定二进制码。utf-8和GBK这两个不同的字符集,规定的字符与二进制之间的映射关系除了二进制码小于127之外的其余映射关系都不同。
举个简单例子来说明映射关系:
utf-8规定1代表苹果
而GBK规定1代表梨子
你在windows下,1就代表梨子,在linux下,1就代表苹果。
但是又由于字符串通常是多位二进制码来表示的,当只要有一个位置的二进制码不能被正确解码的时候,就会出现上诉错误。
此外当我们使用python2写python module(以.py为后缀的文件)的时候,可以在行首声明该脚本的默认编码方式为utf-8,否则以python2默认的编码方式,是无法解码中文字符的。

另外,如果在pyhton2中

python
str = '中文'
str.decode(‘ascii’)
Traceback (most recent call last):
  File "", line 1, in 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

因为在字符集ascii的映射关系中,对二进制码大于127的,没有规定映射关系,所以当二进制码大于127,就会解码失败。
0xe4的十进制是228,已经大于127,所以用ascii解码的时候,不能正常解码。

对于pyhton2,当我们在使用Pycharm等IDE的时候,可以在每个pyhton module的开头声明该脚本的编码集为utf-8,因为python的默认编码是ascii,不包含中文的编码集,自然也不能正确解码中文字符串等其他二进制码大于等于128的字符。

# -*- coding: utf-8 -*-

关于utf-8,utf-16,gbk,ascii这些字符集以及unicode。推荐参考:
https://www.zhihu.com/question/23374078/answer/69732605

你可能感兴趣的:(在windows下 gbk,linux下utf-8注意事项)