python 的字符编码

Posted FLYMOOD

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 的字符编码相关的知识,希望对你有一定的参考价值。

1. unicode 与utf-8

https://www.jianshu.com/p/e1fd1d936278

  • ASCII 是字符集+编码规则。只对英文字母和常见的符号进行了编号,最多只有256个字符(一个byte)
  • Unicode 是「字符集」, 为世界上的所有字符统一指定了一个2byte 数字
  • UTF-8 是「编码规则」, 这是一种存储编码实现方式,感觉是为了节省内存空间用的。使用不定长度编码,比如字母用1个byte, 汉字用三个byte.

 

https://www.cnblogs.com/lowmanisbusy/p/9136347.html

unicode编码: unicode编码为世界上所有字符都分配了一个唯一编号, 为十六进制, 如中文简体汉字 “渣” 的 Unicode编号就是 6E23,

unicode仅仅定义了每个字符的编号,并没有定义如何将这个编号进行存储的方式,所以后来出现了utf-8, gbk等编码格式, 它们都是 unicode 的一种实现方式, 仍然使用了unicode 中的唯一编号,个人对其的简单理解就是在unicode编码的基础之上又定义了对字符的存储方式.

 

https://www.jianshu.com/p/9920595791b7

在计算机最早期,只有ascii编码,但是ascii编码方式一个字符只占用一个字节,这样就只能表示英文字符了,这时候中文字符就无法表示了,所以我国出现了gb2312的编码方式,使得中文可以表示,各个国家有着各个国家的语言,如果每个语言都是用一套各自的编码方式,那这个就没有办法统一了,别人写的代码可能换个语言环境就无法正常运行了,因此才出现了unicode,统一了各种编码方式
utf-8的产生是为了节省空间而出现的,前面讲到unicode通常占用2个字节,但是对于英文字符其实只需要一个字节就可以表示了,因此utf-8为了节省空间实现了动态长度的表示,比如它在编码中对英文字符用1个字节表示,而通常对于汉字就是用3个字节表示。

2. Python2 中

python2默认字符编码为:ASCII, ASCII码 包含了128个字符, 其中包括所有的英文字符, 阿拉伯数字, 标点符号, 控制符号等

在python2 中使用sys.getdefaultencoding() 得到的是 ascii

 

在python2中字符串分为 unicode 和 str 类型

str : \'this is a str\'

unicode: u\'this is a unicode code\'


事实上, python2 中被引号括起来的字符串就是 str, 而str 本身 就是一串字节码(byte).
如果被括起来字符是字母,那么就是ascii 编码的字符。
如果被括起来字符是汉字,那么也能得到一串字节, 但是字节码是什么编码格式的就不确定了。所以最好加上u\'\', 指定为unicode 编码。

  Str To Unicode 使用decode(), 解码

  Unicode To Str 使用encode(), 编码

如果要将str 转换成unicode, 那么需要使用decode(), 将ascii 字符转换成unicode 字符。




3. Python3 中

 python3默认字符编码为:utf-8

在python3 中使用如下代码得到的是 utf-8

sys.getdefaultencoding()

 

在python3中字符串分为 str 和 bytes 两种类型, 没有unicode 类型的字符串了。

byte 表示:前者包含原始的8位值

str 表示: unicode 字符 (用双引号括起来就是str 类型的)

https://www.jianshu.com/p/9920595791b7

 

    Str To Bytes 使用 encode(), 编码
    Bytes To Str 使用 decode(), 解码

 

 

因为 python3 中没有 unicode 类型的字符串, 所有在 python3 中使用下面这种方式定义字符串是没有意义的

 

my_str = u"渣男不但丑"

 

 

 

 

4. 其他和字符编码有关

python \'gbk\' codec can\'t decode byte 0xac in position

https://blog.csdn.net/qq_31824879/article/details/83024457

需要指定文件编码

f = open(\'1.txt\',\'r\',encoding=\'utf-8\')

 

 

Urlib中的quote 函数:

https://www.cnblogs.com/lu-test/p/9962640.html

URL编码的方式是把需要编码(非ASCII)的字符转化为 %xx 的形式。通常 URL 编码是基于 UTF-8 的(当然这和浏览器平台有关)。

 

在 Python2.x 中的用法是:
urllib.quote(text)
Python3.x 中是
urllib.parse.quote(text)
按照标准, URL 只允许一部分 ASCII 字符(数字字母和部分符号),其他的字符(如汉字)是不符合 URL 标准的。

以上是关于python 的字符编码的主要内容,如果未能解决你的问题,请参考以下文章

如何测试文本片段是不是是 Quoted-printable 编码的

Python 必知的 20 个骚操作!

python编码与代码注释

python+spark程序代码片段

Python代码阅读(第25篇):将多行字符串拆分成列表

Python string中删除(过滤)掉emoji表情字符