Unicode 是字符集
UTF-8 是编码规则
Unicode:给每一个字符分配一个唯一的ID(又称码位)。
编码规则:将码位转换为字节序列的规则。

1、什么是字符编码:字符翻译成数字,所遵循的标准就是字符编码

2、以下两个场景涉及到字符编码的问题:

1.文件在存、取时
2.文件执行时

为什么硬盘中的文件不用Unicode编码形式存储。

Unicode: 转换速度快,缺点:占用空间大

Utf-8:      节省空间,缺点:转换速度慢。

因为Unicode和utf8的优缺点所以内存使用Unicode,硬盘上的字符编码可以用户自定义

unicode----->encode----->utf-8  存储
utf-8------->decode----->unicode 读取

常见的字符编码:

ASCII:    1Bytes = 1字符 =8bit,8bit:2**8-1=256个字符,无法表示中文。
GBK(可变长): 中文2字节,英文1字节
unicode(定长): 2字节, 虽然2**16-1=65535,但可以存放100w+个字符 。又名:万国码
UTF-8(可变长):英1Bytes,中3Bytes,生僻字占用更多Bytes。最大空间可以有6字节。

如何正确使用编码:

1、保存和读取时用的编码必须一致。
2、代码需要指定执行时的编码格式
3、bytes类型:由Unicode encode的结果
4、只有Unicode类型才可以调用encode方法,可以encode成GBK,UTF-8等编码形式(都是bytes类型)

程序执行的过程:

在python3中bytes类型与unicode相互转换:Encode、Decode

阶段一:启动python解释器

阶段二:程序加载到内存

1、Python3先解码成Unicode编码格式,再加载到内存(加载到内存的代码是unicode编码格式)
2、可以用sys.getdefaultencoding()查看Python中默认的解码方式。
3、行首:coding:xxx表示已什么编码格式解码成Unicode。python2中默认使用ascii解码,python3中默认使用utf-8解码

阶段三:执行

程序执行时,局部变量会开辟新的内存空间,在python2中字符串是bytes类型,Python3 中str就是以unicode形式保存的

Python2

str类型

1、在python2中字符串是bytes类型
2、当python解释器执行到产生字符串的代码时(例如x='上'),会申请新的内存地址,然后将'上'编码成文件开头指定的编码格式
3、要想看x在内存中的真实格式,就以列表形式打印,如果直接print()会自动转换编码,这一点我们稍后再说。
Python2自动把字符串encode了一下,编码方式来自于文件头的编码。
#coding:gbk
x='上'
print([x,y])        #['\xc9\xcf', '\xcf\xc2']
print(type(x),type(y))  #(<type 'str'>, <type 'str'>)
#\x代表16进制,此处是c9cf总共4位16进制数,一个16进制四4个比特位,
#4个16进制数则是16个比特位,即2个Bytes,这就证明了按照gbk编码中文用2Bytes
#coding:gbk
x=u'上' #等同于 x='上'.decode('gbk')
y=u'下' #等同于 y='下'.decode('gbk')
print([x,y]) #[u'\u4e0a', u'\u4e0b']
print(type(x),type(y)) #(<type 'unicode'>, <type 'unicode'>)

5.3.2 python3 中

Python3 中str就是以unicode形式保存的

#coding:gbk
x='上'
print(type(x)) #<class 'str'>
print(x.encode('gbk')) #b'\xc9\xcf'
print(type(x.encode('gbk'))) #<class 'bytes'>

python2中的str类型就是bytes类型,Python3中的str和bytes不是一回事。

python——字符编码的更多相关文章

  1. python 字符编码练习

    通过下面的练习,加深对python字符编码的认识 # \x00 - \xff 256个字符 >>> a = range(256)>>> b = bytes(a) # ...

  2. Python字符编码讲解

    声明:本文参考 Python字符编码详解 在计算机中我们不管用什么语言和程序,最终数据在计算机中的都是字节码(也就是01形式)的形式存在的,如果 计算机直接把字节码显示在屏幕上,很明显一般人看不懂字节 ...

  3. 深入理解Python字符编码--转

    http://blog.51cto.com/9478652/2057896 不论你是有着多年经验的 Python 老司机还是刚入门 Python 不久,你一定遇到过UnicodeEncodeError ...

  4. 深入理解Python字符编码

    不论你是有着多年经验的 Python 老司机还是刚入门 Python 不久,你一定遇到过UnicodeEncodeError.UnicodeDecodeError 错误,每当遇到错误我们就拿着 enc ...

  5. Python字符编码详解,str,bytes

    什么是明文 “明文”是可以是文本,音乐,可以编码成mp3文件.明文可以是图像的,可以编码为gif.png或jpg文件.明文是电影的,可以编码成wmv文件.不一而足. 什么是编码?把明文变成计算机语言 ...

  6. Python字符编码补充

    字符编码: Python字符编码贯穿Python学习的始终,现在应用的是Python2中字符编码的问题是很多的. 这次是要彻底解决Python字符编码的问题!!! 1 字符编码的发展过程: 1 .AS ...

  7. python --- 字符编码学习小结(二)

    距离上一篇的python --- 字符编码学习小结(一)已经过去2年了,2年的时间里,确实也遇到了各种各样的字符编码问题,也能解决,但是每次都是把所有的方法都试一遍,然后终于正常.这种方法显然是不科学 ...

  8. 转1:Python字符编码详解

    Python27字符编码详解 声明 一 字符编码基础 1 抽象字符清单ACR 2 已编码字符集CCS 3 字符编码格式CEF 31 ASCII初创 311 ASCII 312 EASCII 32 MB ...

  9. 转2:Python字符编码详解

    1. 字符编码简介 1.1. ASCII ASCII(American Standard Code for Information Interchange),是一种单字节的编码.计算机世界里一开始只有 ...

  10. python字符编码(二)

    一.什么是字符编码 计算机要想工作必须通电,也就是说‘电’驱使计算机干活,而‘电’的特性,就是高低电压(高低压即二进制数1,低电压即二进制数0),也就是说计算机只认识数字 编程的目的是让计算机干活,而 ...

随机推荐

  1. 灰色大气企业html5模板

    灰色大气企业html网页模板是一款以灰色为背景的大气简洁企业html5网站模板. 下载地址:http://www.huiyi8.com/sc/10860.html

  2. Go丨语言对数据库操作报错 panic: dial tcp 127.0.0.1:3306: connectex: No connection could be made because the target machine actively refused it.

    panic: dial tcp 127.0.0.1:3306: connectex: No connection could be made because the target machine ac ...

  3. listen 75

    Hot Jupiters Smarten Search For Other Earths Scientists are looking for Earth like planets around ot ...

  4. ef 多个模块,通过程序集映射entity,指定对应的repository

    在Entity Framework repository下加两个方法: public virtual T GetByEntityName(object id, string EntityTypeNam ...

  5. numpy中的tile函数

    tile()函数可以很方便的生成多维数组.它有两个参数,第一个数是原始数组;第二个表示如何来生成,第一个数字表示生成几行,第二个表示每行有多少个原始数组(如果只写一个数字,那么就默认是一行). fro ...

  6. Maven-将jar包安装到本地仓库

    因为项目需要,使用的是sqlserver数据库,但是却找不到其对应的pom依赖,所以需要将本地jar包安装到本地仓库,定义pom依赖.以此为例,其他jar包均可参考该方式 cmd命令语句: mvn i ...

  7. Android的appium实例

    1.查看Android的应用包名和activity的方法   (网上有很多种方法,这里应用的是查看日志的方法) CMD中输入>adb logcat -c                   &g ...

  8. Mac环境下安装node.js、npm、express

    一:node.js安转 方法一:下载node.js for Mac 地址: http://nodejs.org/download/ 直接下载 pkg的,双击安装,一路点next,很容易就搞定了. 安装 ...

  9. 「NOIP2017」「LuoguP3959」 宝藏(爆搜

    题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 nn 个深埋在地下的宝藏屋, 也给出了这 nn 个宝藏屋之间可供开发的mm 条道路和它们的长度. 小明决心亲自前往挖掘所有宝藏屋中的宝藏. ...

  10. 使用Tornado作为Django App的服务器

    闲来无事,折腾折腾. 老是听说tonado是个异步web框架和服务器,作为框架倒是了解到了,但是服务器一直不太懂.所以决定了解一下,既然可以做服务器,那就把自己的django app部署到这上边去. ...