zoukankan      html  css  js  c++  java
  • Python基础字符编码与转码

    ***了解计算机的底层原理***

    Python全栈开发之Python基础-字符编码与转码

    需知:

    1.在python2默认编码是ASCII, python3里默认是utf-8

    2.unicode 分为 utf-32(占4个字节),utf-16(占两个字节),utf-8(占1-4个字节), so utf-8就是unicode

    3.在py3中encode,在转码的同时还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string

    一、python2

    1. py2里默认编码是ascii
    2. 文件开头那个编码声明是告诉解释这个代码的程序 以什么编码格式 把这段代码读入到内存,因为到了内存里,这段代码其实是以bytes二进制格式存的,不过即使是2进制流,也可以按不同的编码格式转成2进制流,你懂么?
    3. 如果在文件头声明了#_*_coding:utf-8*_,就可以写中文了, 不声明的话,python在处理这段代码时按ascii,显然会出错, 加了这个声明后,里面的代码就全是utf-8格式了
    4. 在有#_*_coding:utf-8*_的情况下,你在声明变量如果写成name=u"大保健",那这个字符就是unicode格式,不加这个u,那你声明的字符串就是utf-8格式
    5. utf-8 to gbk怎么转,utf8先decode成unicode,再encode成gbk

    二、python3

    1. py3里默认文件编码就是utf-8,所以可以直接写中文,也不需要文件头声明编码了,干的漂亮
    2. 你声明的变量默认是unicode编码,不是utf-8, 因为默认即是unicode了(不像在py2里,你想直接声明成unicode还得在变量前加个u), 此时你想转成gbk的话,直接your_str.encode("gbk")即可以
    3. 但py3里,你在your_str.encode("gbk")时,感觉好像还加了一个动作,就是就是encode的数据变成了bytes里,我操,这是怎么个情况,因为在py3里,str and bytes做了明确的区分,你可以理解为bytes就是2进制流,你会说,我看到的不是010101这样的2进制呀, 那是因为python为了让你能对数据进行操作而在内存级别又帮你做了一层封装,否则让你直接看到一堆2进制,你能看出哪个字符对应哪段2进制么?什么?自己换算,得了吧,你连超过2位数的数字加减运算都费劲,还还是省省心吧。  
    4. 那你说,在py2里好像也有bytes呀,是的,不过py2里的bytes只是对str做了个别名,没有像py3一样给你显示的多出来一层封装,但其实其内部还是封装了的。 这么讲吧, 无论是2还是三, 从硬盘到内存,数据格式都是 010101二进制到-->b'\xe4\xbd\xa0\xe5\xa5\xbd' bytes类型-->按照指定编码转成你能看懂的文字

    编码应用比较多的场景应该是爬虫了,互联网上很多网站用的编码格式很杂,虽然整体趋向都变成utf-8,但现在还是很杂,所以爬网页时就需要你进行各种编码的转换,不过生活正在变美好,期待一个不需要转码的世界。

    最后,编码is a piece of fucking shit, noboby likes it.

    ps:

    python2 的用法

    gbk转成utf-8

     1 1 [root@python2 scripts]# cat encode.py 
     2  2 #!/usr/bin/env python
     3  3 # -*- coding:utf-8 -*-      
     4  4 #Author: nulige
     5  5 
     6  6 import sys
     7  7 print(sys.getdefaultencoding())
     8  8 
     9  9 s = "你好"
    10 10 s_to_unicode = s.decode("utf-8")
    11 11 print(s_to_unicode)
    12 12 s_to_gbk = s_to_unicode.encode("gbk")
    13 13 print(s_to_gbk)
    14 14 
    15 15 gbk_to_utf8 = s_to_gbk.decode("gbk").encode("utf-8")
    16 16 print(gbk_to_utf8)
    View Code

    执行结果:

    1 [root@python2 scripts]# python encode.py
    2 ascii      #系统默认编码
    3 你好
    4 ?oí
    5     你好    #gbk转成utf-8

    utf-8是unicode的扩展集

     1 [root@python2 scripts]# cat encode.py 
     2 #!/usr/bin/env python
     3 # -*- coding:utf-8 -*-      
     4 #Author: nulige
     5 
     6 import sys
     7 print(sys.getdefaultencoding())
     8 
     9 s = u"你好"
    10 print(s)
    11 
    12 s_to_unicode = s.decode("utf-8")
    13 print(s_to_unicode)
    14 s_to_gbk = s_to_unicode.encode("gbk")
    15 print(s_to_gbk)
    16 
    17 gbk_to_utf8= s_to_gbk.decode("gbk").encode("utf-8")
    18 print(gbk_to_utf8)
    View Code

    执行结果:

    1 [root@python2 scripts]# python encode.py
    2 ascii
    3 你好      #utf-8是unicode的扩展集,所以这里也是可以显示中文的
    4 Traceback (most recent call last):
    5   File "encode.py", line 11, in <module>
    6     s_to_unicode = s.decode("utf-8")
    7   File "/usr/local/lib/python2.7/encodings/utf_8.py", line 16, in decode
    8     return codecs.utf_8_decode(input, errors, True)
    9 UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
    View Code

    gbk转成utf8

     1 [root@python2 scripts]# cat encode.py 
     2 #!/usr/bin/env python
     3 # -*- coding:utf-8 -*-      
     4 #Author: nulige
     5 
     6 import sys
     7 print(sys.getdefaultencoding())
     8 
     9 s = u"你好"
    10 print(s)
    11 
    12 s_to_gbk = s.encode("gbk")
    13 print(s_to_gbk)
    14 
    15 gbk_to_utf8= s_to_gbk.decode("gbk").encode("utf-8")
    16 print(gbk_to_utf8)
    View Code

    执行结果:

    1 1 [root@python2 scripts]# python encode.py 
    2 2 ascii
    3 3 你好
    4 4 ?oí
    5 5     你好
    View Code

    python3

     1  1 #!/usr/bin/env python
     2  2 #Author: nulige
     3  3 
     4  4 import sys
     5  5 print(sys.getdefaultencoding())
     6  6 
     7  7 s = "你哈"                   #默认是utf-8
     8  8 s_gbk = s.encode("gbk")     #utf-8转成gbk
     9  9 
    10 10 print(s_gbk)
    11 11 print(s.encode())
    View Code

    执行结果:

    1 utf-8                     #python默认是utf-8
    2 b'\xc4\xe3\xb9\xfe'       #utf-8转成gbk
    3 b'\xe4\xbd\xa0\xe5\x93\x88'
     1 1 #!/usr/bin/env python
     2  2 #Author: nulige
     3  3 
     4  4 import sys
     5  5 print(sys.getdefaultencoding())
     6  6 
     7  7 s = "你哈"
     8  8 s_gbk = s.encode("gbk")
     9  9 
    10 10 print(s_gbk)
    11 11 print(s.encode())
    12 12 
    13 13 gbk_to_utf8 = s_gbk.decode("gbk").encode("utf-8")    #gbk转成utf-8
    14 14 print("utf8",gbk_to_utf8)
    View Code

    执行结果:

    1 1 utf-8
    2 2 b'\xc4\xe3\xb9\xfe'
    3 3 b'\xe4\xbd\xa0\xe5\x93\x88'
    4 4 utf8 b'\xe4\xbd\xa0\xe5\x93\x88'

    总结

    把PyCharm字符编码调成gbk

     1 #!/usr/bin/env python
     2 # -*-coding:gbk-*-
     3 #Author: nulige
     4 
     5 #不同字符编码要先转成uncode
     6 import sys
     7 print(sys.getdefaultencoding())
     8 
     9 s = '你好'   #默认uncode
    10 print(s.encode("gbk"))
    11 print(s.encode("utf-8"))
    12 print(s.encode("utf-8").decode("utf-8").encode("gb2312"))
    13 print(s.encode("utf-8").decode("utf-8").encode("gb2312").decode("gb2312"))

    执行结果:

    1 utf-8
    2 b'\xc4\xe3\xba\xc3'
    3 b'\xe4\xbd\xa0\xe5\xa5\xbd'
    4 b'\xc4\xe3\xba\xc3'
    5 你好
  • 相关阅读:
    不能创建会计分录
    java反射,代码优化
    mybatis$和#的区别
    开发中积累的单词800
    mybatis递归,一对多代码示例
    mysql树形结构递归查询
    redis实现分布式锁工具类 灰常好用
    js代码小优化
    spring源码分析 contextConfigLocation属性的位置
    data:image/png;base64这什么玩意
  • 原文地址:https://www.cnblogs.com/zn0523/p/6144312.html
Copyright © 2011-2022 走看看