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
- py2里默认编码是ascii
- 文件开头那个编码声明是告诉解释这个代码的程序 以什么编码格式 把这段代码读入到内存,因为到了内存里,这段代码其实是以bytes二进制格式存的,不过即使是2进制流,也可以按不同的编码格式转成2进制流,你懂么?
- 如果在文件头声明了#_*_coding:utf-8*_,就可以写中文了, 不声明的话,python在处理这段代码时按ascii,显然会出错, 加了这个声明后,里面的代码就全是utf-8格式了
- 在有#_*_coding:utf-8*_的情况下,你在声明变量如果写成name=u"大保健",那这个字符就是unicode格式,不加这个u,那你声明的字符串就是utf-8格式
- utf-8 to gbk怎么转,utf8先decode成unicode,再encode成gbk
二、python3
- py3里默认文件编码就是utf-8,所以可以直接写中文,也不需要文件头声明编码了,干的漂亮
- 你声明的变量默认是unicode编码,不是utf-8, 因为默认即是unicode了(不像在py2里,你想直接声明成unicode还得在变量前加个u), 此时你想转成gbk的话,直接your_str.encode("gbk")即可以
- 但py3里,你在your_str.encode("gbk")时,感觉好像还加了一个动作,就是就是encode的数据变成了bytes里,我操,这是怎么个情况,因为在py3里,str and bytes做了明确的区分,你可以理解为bytes就是2进制流,你会说,我看到的不是010101这样的2进制呀, 那是因为python为了让你能对数据进行操作而在内存级别又帮你做了一层封装,否则让你直接看到一堆2进制,你能看出哪个字符对应哪段2进制么?什么?自己换算,得了吧,你连超过2位数的数字加减运算都费劲,还还是省省心吧。
- 那你说,在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 [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 = "你好"
10 s_to_unicode = s.decode("utf-8")
11 print(s_to_unicode)
12 s_to_gbk = s_to_unicode.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)
执行结果:
1 [root@python2 scripts]# python encode.py
2 ascii #系统默认编码
3 你好
4 ?oí
5 你好 #gbk转成utf-8
utf-8是unicode的扩展集
[root@python2 scripts]# cat encode.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author: nulige import sys
print(sys.getdefaultencoding()) s = u"你好"
print(s) s_to_unicode = s.decode("utf-8")
print(s_to_unicode)
s_to_gbk = s_to_unicode.encode("gbk")
print(s_to_gbk) gbk_to_utf8= s_to_gbk.decode("gbk").encode("utf-8")
print(gbk_to_utf8)
执行结果:
[root@python2 scripts]# python encode.py
ascii
你好 #utf-8是unicode的扩展集,所以这里也是可以显示中文的
Traceback (most recent call last):
File "encode.py", line 11, in <module>
s_to_unicode = s.decode("utf-8")
File "/usr/local/lib/python2.7/encodings/utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
gbk转成utf8
[root@python2 scripts]# cat encode.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#Author: nulige import sys
print(sys.getdefaultencoding()) s = u"你好"
print(s) s_to_gbk = s.encode("gbk")
print(s_to_gbk) gbk_to_utf8= s_to_gbk.decode("gbk").encode("utf-8")
print(gbk_to_utf8)
执行结果:
1 [root@python2 scripts]# python encode.py
2 ascii
3 你好
4 ?oí
5 你好
python3
1 #!/usr/bin/env python
2 #Author: nulige
3
4 import sys
5 print(sys.getdefaultencoding())
6
7 s = "你哈" #默认是utf-8
8 s_gbk = s.encode("gbk") #utf-8转成gbk
9
10 print(s_gbk)
11 print(s.encode())
执行结果:
1 utf-8 #python默认是utf-8
2 b'\xc4\xe3\xb9\xfe' #utf-8转成gbk
3 b'\xe4\xbd\xa0\xe5\x93\x88'
1 #!/usr/bin/env python
2 #Author: nulige
3
4 import sys
5 print(sys.getdefaultencoding())
6
7 s = "你哈"
8 s_gbk = s.encode("gbk")
9
10 print(s_gbk)
11 print(s.encode())
12
13 gbk_to_utf8 = s_gbk.decode("gbk").encode("utf-8") #gbk转成utf-8
14 print("utf8",gbk_to_utf8)
执行结果:
1 utf-8
2 b'\xc4\xe3\xb9\xfe'
3 b'\xe4\xbd\xa0\xe5\x93\x88'
4 utf8 b'\xe4\xbd\xa0\xe5\x93\x88'
总结
把PyCharm字符编码调成gbk
#!/usr/bin/env python
# -*-coding:gbk-*-
#Author: nulige #不同字符编码要先转成uncode
import sys
print(sys.getdefaultencoding()) s = '你好' #默认uncode
print(s.encode("gbk"))
print(s.encode("utf-8"))
print(s.encode("utf-8").decode("utf-8").encode("gb2312"))
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基础-字符编码与转码的更多相关文章
- Python中字符编码及转码
python 字符编码及转码 python 默认编码 python 2.X 默认的字符编码是ASCII, 默认的文件编码也是ASCII python 3.X 默认的字符编码是unicode,默认的文件 ...
- python基础-----字符编码
1.ASCII ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现 ...
- 第2章 Python基础-字符编码&数据类型 字符编码&字符串 练习题
1.简述位.字节的关系 位(bit)是计算机中最小的表示单元,数据传输是以“位”为单位的,1bit缩写为1b 字节(Byte)是计算机中最小的存储单位,1Byte缩写为1B 8bit = 1Byte ...
- Python基础(字符编码与文件处理)
一.了解字符编码的知识储备 1.计算机基础知识(三副图) 2.文本编辑器存取文件的原理(notepad++,Pycharm,word) 打开编辑器就启动了一个进程,是在内存中运行的,所以在编辑器写的内 ...
- python基础--字符编码以及文件操作
字符编码: 1.运行程序的三个核心硬件:cpu.内存.硬盘 任何一个程序要是想要运算,肯定是先从硬盘加载到当前的内存中,然后cpu根据指定的指令去执行操作 2.python解释器运行一个py文件的步骤 ...
- python(字符编码与转码)
一.字符编码演变史 二进制(0 1) """ 算机中的所有数据,不论是文字.图片.视频.还是音频文件,本质上最终都是按照类似 01010101 的二进制存储的,再说简单点 ...
- python之字符编码与转码
说起python编码,真是句句心酸,今天终于是,终于梳理清楚了,下面我们就来一起揭开py编码的真相吧! 一,什么是编码? 其实基本概念很简单.我们都知道消息,那么消息就是人类所能理解的,简单易懂的存在 ...
- 第2章 Python基础-字符编码&数据类型 列表&元祖 练习题
1.创建一个空列表,命名为names,往里面添加old_driver,rain,jack,shanshan,peiqi,black_girl元素 names = ["old_driver&q ...
- 第2章 Python基础-字符编码&数据类型 购物车&多级菜单 作业
作业 一.三级菜单 数据结构: menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村':{ '爱奇艺':{}, ...
随机推荐
- 二分K-means算法
二分K-means聚类(bisecting K-means) 算法优缺点: 由于这个是K-means的改进算法,所以优缺点与之相同. 算法思想: 1.要了解这个首先应该了解K-means算法,可以看这 ...
- [译]:Orchard入门——媒体文件的添加与管理
原文链接:Adding and Managing Media Content 注:此文内容相对较老,实际操作指导性不强,仅适合做研究 当你利用富文本编辑器上传图片时(或者使用XML-RPC客户端,例如 ...
- Android Studio 之 no render target selected
今天第一次使用android studio, 莫名其妙出现 no render target selected的错误,没有设计界面, 各种百度之后在 stackoverflow.com/questio ...
- poj 3069 Saruman's Army
Saruman's Army Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8477 Accepted: 4317 De ...
- 关于datatime 时间处理模块:
import time from datetime import datetime from datetime import timedelta aHour= ...
- 我的c++学习(10)this指针
问题:当在对象的外部访问该对象的公有成员时,必须指明是哪一个对象.但是当我们用对象的成员函数来访问本对象的成员时,在成员函数中只要给出成员名就可以实现对该对象成员的访问.再进一步可用同一个类创建很多个 ...
- node.js安装
Node.js是一个基于Chrome JavaScript运行时建立的一个平台,用来方便地搭建快速的,易于扩展的网络应用Node.js借助事件驱动,非阻塞I/O模型变得轻量和高效,非常适合run ac ...
- uva12546. LCM Pair Sum
uva12546. LCM Pair Sum One of your friends desperately needs your help. He is working with a secret ...
- 【原】iOS学习之控制器的创建
本次博客是一篇总结性质的博客,总结的是各种创建控制器的方式以及一些需要注意的操作. 1.通过storyboard创建控制器 正如我上一篇博客中所说,当 Main Interface 没有选定的时候,我 ...
- WPF 四种样式
1.内联样式<TextBlock FontSize="20" Foreground="Blue">好啊</TextBlock> 2.页面 ...