Python基础字符编码与转码

摘要:
***了解计算机***Python全栈开发的基本原理Python基础知识-字符编码和代码转换需要了解:1.在Python 2中,默认编码是ASCII,在Python 3中,默认编码为utf-82。Unicode分为utf-32、utf-16、utf-8和soutf-8。3.在py3中,encode在转码时将字符串更改为字节。解码时,Decode将字节改回字符串1。python2py2中的默认代码是ascii文件开头的代码。代码声明告诉程序以何种代码格式解释代码,以便将代码读入内存。由于代码以字节二进制格式存储在存储器中,因此即使二进制流也可以根据不同的编码格式转换为二进制流。你明白吗?

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

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

Python基础字符编码与转码第1张

一、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

Python基础字符编码与转码第2张Python基础字符编码与转码第3张
 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的扩展集

Python基础字符编码与转码第4张Python基础字符编码与转码第5张
 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

执行结果:

Python基础字符编码与转码第6张Python基础字符编码与转码第7张
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

Python基础字符编码与转码第8张Python基础字符编码与转码第9张
 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

执行结果:

Python基础字符编码与转码第10张Python基础字符编码与转码第11张
1 1 [root@python2 scripts]# python encode.py 
2 2 ascii
3 3 你好
4 4 ?oí
5 5     你好
View Code

python3

Python基础字符编码与转码第12张Python基础字符编码与转码第13张
 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'
Python基础字符编码与转码第14张Python基础字符编码与转码第15张
 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 你好

免责声明:文章转载自《Python基础字符编码与转码》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇xshell 配色方案神经网络用于手写数字识别下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

python selenium 编码问题

#coding=utf-8 from selenium import webdriver driver = webdriver.Firefox() driver.get("http://www.baidu.com") # 返回百度页面底部备案信息 text = driver.find_element_by_id("cp").text print(tex...

Python与c/c++混合编程

https://blog.csdn.net/hobertony_7/article/details/88875246?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-4.control&dist_request_id=&dept...

python冲刺(4)切片 等

   L[0:3] 表示从索引0开始,取到第3个元素为止(不包含第三个)。 只用一个L[:]表示从头到尾。   L[::2] 第三个参数表示每N个取一个,上面的L[::2]会每两个元素取出一个来,也就是各一个取一个。 把list换成tuple,切片操作完全相同, 迭代: 用for 循环迭代数列1-100并打印出7的倍数: for i in range(1,...

python面试题库——1Python基础篇

第一部分 Python基础篇(80题) 为什么学习Python?             语言本身简洁,优美,功能超级强大,跨平台,从桌面应用,web开发,自动化测试运维,爬虫,人工智能,大数据处理都能做         Python和Java、PHP、C、C#、C++等其他语言的对比?                C语言由于其底层操作特性和历史的积累...

django之数据库表的单表查询

一、添加表记录 对于单表有两种方式 # 添加数据的两种方式 # 方式一:实例化对象就是一条表记录 Frank_obj = models.Student(name ="海东",course="python",birth="2000-9-9",fenshu=80) Frank_obj.save() # 方式二: mo...

【Python】使用socketserver建立一个异步TCP服务器

概述 这篇文章是讲解如何使用socketserver建立一个异步TCP服务器,其中Python版本为3.5.1。 socketserver主要的类 socketserver模块中的类主要有以下几个:1、BaseServer 包含服务器的核心功能与混合类(mix-in)的钩子功能。这个类主要用于派生,不要直接生成这个类的类对象,可以考虑使用TCPServer...