# -*- coding: utf-8 -*-

# 直接保存为Python脚本,对照执行结果会好看点。
# 实验的内容都是在Python 2.7.x下进行的。
# Python3默认采用unicode来处理内部编码问题,所以不适用本内容。 #########################
# Python中的字符类型 #
######################### # Python中的字符类型分两种:
# 1. str类型:ascii表中的字符,占一个字节,所以也叫字节字符。字面量用双引号表示。
# 2. unicode类型:一个字符串占用的字节数由保存时采用的编码格式相关。字面量用带“u”前缀的双引号表示。
s = 'OK, '
u = u'我, '
u1 = u'我'
u2 = u'爱Python'
print 's:', s
print 'u1:', u1
print 'u2:', u2 # 解析器通常把unicode字符转换成Unicode转义序列
# 转义序列以"\u"开头
print 'repr(s): ', repr(s)
print 'repr(u1): ', repr(u1)
print 'repr(u2): ', repr(u2) # 这种转义序列只在unicode字面量中有效
print "'\u6211': ", '\u6211'
print "u'\u6211': ", u'\u6211'
print '' # 也可以用str()函数创建str字符串,用unicode()函数创建unicode字符串
print 'type of str(s): ', type(str(s))
print 'type of unicode(s): ', type(unicode(s))
# 可以给unicode()函数传入一个unicode字符串
print 'type of unicode(u): ', type(unicode(u))
# 但是如果我们给unicode()函数传入'我',又会怎样呢?
try:
print "unicode('我'):", unicode('我')
except UnicodeDecodeError as e:
# 错误信息
# 解析器试图用ascii编码来解码我们传入的参数,原因会在下面将到
print e #########################
# 编码和解码 #
######################### # 编码的过程其实就是采用一定的编码格式将unicode字符转换成str字符的过程
# 非ascii码字符按字节为单位被编码成十六进制转义字符
# 解码采用的编码格式跟设置和环境有关
utf8_s = s.encode('utf-8')
utf8_u = u.encode('utf-8')
utf8_u1 = u1.encode('utf-8')
utf8_u2 = u2.encode('utf-8')
print 'utf8_s: ', s
print 'repr utf8_u: ', repr(s)
print 'utf8_u: ', u
print 'repr utf8_u: ', repr(utf8_u)
print 'utf8_u1: ', utf8_u1
print 'repr utf8_u1: ', repr(utf8_u1)
print 'utf8_u2:', utf8_u2
print 'repr utf8_u2: ', repr(utf8_u2)
# 如果我们的str字面量中有非ascii码字符,解析器会自动对其进行编码
print "'我爱Python': ", '我爱Python'
print "repr '我爱Python': ", repr('我爱Python') # 来看看上面碰到的问题,我们将带‘我’(str类型)传给unicode函数,结果报错了
try:
print "unicode('我'):", unicode('我')
except UnicodeDecodeError as e:
# 发生错误了,解析器试图用ascii编码来解码我们传入的参数
print e
# 原因就是解析器会先将参数用默认的编码格式(这里是utf-8)进行编码,然后传给unicode()函数,
# unicode函数的帮助信息,其中有段是这么说的:
'''unicode(string[, encoding[, errors]]) -> unicode object
|
| Create a new Unicode object from the given encoded string.
| encoding defaults to the current default string encoding.
'''
# unicode类总会用第二个参数指定的编码格式来解码第一个参数,如果第二个参数为空,就采用默认的格式。
# 脚本开头指定了utf-8编码格式,因此这里传入的‘我’被自动采用utf-8进行编码。
# 可是这里unicode并没有采用我们开头指定的utf-8格式来解码,而是ascii码,那当然会报错。
# 为什么会采用ascii码,我估计原因是这样的,Python 2.7.x在解析器内都是默认采用ascii作为默认编码格式的,
# 而我们在文件开头指定的utf-8格式只对本文件中的字符串字面量有效,而unicode类是定义在其他的模块文件里。 # 我们在文件开头用了“coding: utf-8”指定了编码格式,
# 因此解析器会采用这个格式去解码本文件中碰到的编码字符串
# 如果这个编码字符串不是用utf-8格式编码的,就会出错
# 用print输出的时候,会忽略这个错误,打印空白
print 'gbk_u1: ', u1.encode('gbk')
print 'repr gbk_u1', repr(u1.encode('gbk'))
try:
# 但如果用decode()函数去解码不正确的编码字符串就会报错
print u1.encode('gbk').decode('utf-8')
except UnicodeDecodeError as e:
print e
print '' #########################
# 更多关于编码字符串 #
######################### # 对解析器来说,编码字符串没什么特别的,就是一个str类型的字符串
# 可以这么理解,unicode字符串经过编码后得到了一个str类型的字符串
print 'type of utf8_u1: ', type(utf8_u1)
# 和普通str字符串一样,解析器会用默认的编码来解码str字符串中的十六进制转义字符
print r"'\xe7\x88\xb1Python': ", '\xe7\x88\xb1Python'
# 你也可以指定编码格式
print r"'\xe7\x88\xb1Python'", '\xe7\x88\xb1Python'.decode('utf-8')
# str字符串通过解码后得到是一个unicode字符串,哪怕是用ascii来解码
print "type of decoded 'a': ", 'a'.decode('utf-8')
# 我们想要在str字符串中包含“\xe7”这样的字符就必须要对“\”转义
print r"'\\xe7\\x88\\xb1Python': ", '\\xe7\\x88\\xb1Python'
# 如果unicode字符串中包含"\xe7"字样又会怎么样呢?
print r"u'\xe7\x88\xb1Python': ", u'\xe7\x88\xb1Python' # 编码字符串中的十六进制转义字符表示一个字节,ascii码字符也是一个字节,
# 因此我们可以通过用len函数计算字符串编码后的编码字符串的长度的方式来得到字符串占用的字节数
print 'length of utf8_u1: ', len(utf8_u1)
print '' #########################
# 字符串相连 #
######################### # str字符串可以相连
print 's + s: ', s + s
# unicode字符串也可以直接相连
print 'u + u1 + u2: ', u + u1 + u2
# 编码字符串相连时,先连接,输出时再一起解码
print 'utf8_u1 + utf8_u2: ', utf8_u1 + utf8_u2
try:
# unicode字符串和编码字符串相连的时候,系统会先用一种编码格式去解码编码字符串,
# 如果不能正确解码编码字符串,就会报错
print 'u + utf8_u1 + utf8_u2: ', \
u + utf8_u1 + utf8_u2
except UnicodeDecodeError as e:
print e # 但是用str字符与编码字符串相连是不会报错的
# 因为str字符的编码字符跟本身是一样的,直接加到编码字符串中不会破坏原编码字符串
# 系统会先将str字符加到编码字符串中,然后一起解码
print 's + utf8_u1 + utf8_u2: ', \
s + utf8_u1 + utf8_u2 # 将编码字符串先解码再与unicode字符相连,就不会报错
print 'decoded s + utf8_u1 + utf8_u2: ', \
s + utf8_u1.decode('utf-8') + utf8_u2.decode('utf-8') # 不同编码格式的编码字符串相连,是不会报错的(都是str类型嘛),但是相连后的结果就乱掉了,系统没办法解码了
print 'repr gbk_u1 + utf8_u2: ', repr(u1.encode('gbk') + u2.encode('utf-8'))
print 'gbk_u1 + utf8_u2: ', u1.encode('gbk') + u2.encode('utf-8') # 总结下字符串相连,要点就是:
# 同类型的直接相连;不同类型,先对unicode类型进行编码(得到str类型的编码字符串),再相连。
print '' #########################
# 文件的编码 #
######################### u = u'我爱Python'
print u
print repr(u) # 先创建一个示例文件
w = open('demo.txt', 'w')
try:
# 直接传入一个unicode字符串,可能会报错
w.write(u)
w.close()
except UnicodeEncodeError as e:
# 错误原因是write()方法只接受str类型的字符串
# 解析器会采用ascii编码去编码unicode字符
print e
print '' # 因此我们需要先编码再写入
w.write(u.encode('utf-8'))
w.close() # 我们再把它读取出来
r = open('demo.txt', 'r')
content = r.read()
r.close() # 通过repr和type检查,我们可以看到读出来的还是str类型的编码字符串
# 而没有被转换成unicde字符串
print 'repr content: ', repr(content)
print 'type of content: ', type(content)
print 'content: ', content # 总结下:
# open()函数以字节为单位,从磁盘读取数据,得到str类型的文本,
# 如果某个字节不是asccii码字符,就用转义的十六进制来表示(其实也就是我们所说的编码字符串)。
# 文本在得到的file对象中都是以这种格式的str字符来处理的。这种方式规避来无法预知的编码问题,而把编码解码
# 的问题抛给调用者自己来解决。
# 因此,我们在处理从文件中读取的文本和程序中其他文本的时候要注意这点,始终记住:
# 同类型的直接相连;不同类型,先对unicode类型进行编码(得到str类型的编码字符串),再相连。 # 那么我们如果要直接处理uncode字符串怎么办?
# 用codecs模块

Python编码与解码的更多相关文章

  1. Python—编码与解码(encode()和decode())

    编码与解码 decode英文意思是解码,encode英文原意是编码. Python 里面的编码和解码也就是 unicode 和 str 这两种形式的相互转化.编码是 unicode -> str ...

  2. python编码和解码

    一.什么是编码 编码是指信息从一种形式或格式转换为另一种形式或格式的过程. 在计算机中,编码,简而言之,就是将人能够读懂的信息(通常称为明文)转换为计算机能够读懂的信息.众所周知,计算机能够读懂的是高 ...

  3. python 编码与解码 decode解码 encode 编码

    >>> '无'   #gbk字符'\xce\xde'>>> str1 = '\xce\xde'>>> str1.decode('gbk')  # ...

  4. python 编码和解码

  5. python base64编码和解码图片

    简介 在实际项目中,可能需要对图片进行大小的压缩,较为常见的方法则是将图片转换为base64的编码,本文就python编码和解码图片做出一定的介绍. 代码 import base64 import o ...

  6. python3中编码与解码的问题

    python3中编码与解码的问题 ASCII .Unicode.UTF-8 ASCII 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此 ...

  7. Python中进行Base64编码和解码

    Base64编码 广泛应用于MIME协议,作为电子邮件的传输编码,生成的编码可逆,后一两位可能有“=”,生成的编码都是ascii字符.优点:速度快,ascii字符,肉眼不可理解缺点:编码比较长,非常容 ...

  8. python中的编码与解码

      编码与解码 首先,明确一点,计算机中存储的信息都是二进制的   编码/解码本质上是一种映射(对应关系),比如‘a’用ascii编码则是65,计算机中存储的就是00110101,但是显示的时候不能显 ...

  9. Python的编码和解码

    Python的编码和解码 在不同的国家,存在不同的文字,由于现在的软件都要做到国际化通用,所以必须要有一种语言或编码方式,来实现各种编码的解码,然后重新编码. 在西方国家,没有汉字,只有英文,所以最开 ...

随机推荐

  1. ArcGis学习教程免费版在线观看

    ArcGis学习教程免费版在线观看 作者:池建    文章来源:清华大学出版社    点击数:150220    更新时间:2013-8-8 摘要:Arcgis学习视频教程根据书籍章节逐步讲解较为详细 ...

  2. Android中GridLayout与GridView区别

    GridLayout初步研究:可以这么说这个布局绝对是开发者的福音,它大大简化了对复杂布局的处理,包括性能提高不是一倍两倍.它与GridView是完全不同的概念, GridView是一种适配器布局,它 ...

  3. 系统磁盘空间/dev/xvda1占满原因分析

    由于项目原因需要定期检查磁盘空间占用情况,常用检查命令如下: 1.查看磁盘空间大小 df -lh 2.查看对应文件大小 du --max-depth=1 -h / 于一日发现在使用Flume + Ka ...

  4. hihocoder 1037 数字三角形

    #1037 : 数字三角形 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 问题描述 小Hi和小Ho在经历了螃蟹先生的任务之后被奖励了一次出国旅游的机会,于是他们来到了大洋彼岸 ...

  5. sublime text 3 扩展插件SideBarEnhancements用法教程

    SideBarEnhancements本是增强侧边栏的插件,这里将教大家如何用来做sublime text 3浏览器预览插件,并可自定义浏览器预览的快捷键. 第一步:安装此插件,搜索相关教程,本博客有 ...

  6. Linux勉強

        block 與 inode 的總量: 未使用與已使用的 inode / block 數量: block 與 inode 的大小 (block 為 1, 2, 4K,inode 為 128 by ...

  7. Android锁屏软件

    需求描述:锁屏软件就是点击应用然后直接锁屏,不会弹出任何界面 设计思路:应用启动以后通过getSystemService获取系统的服务,调用安卓系统的DevicePolicyManager和Compo ...

  8. 一步步搭建自己的轻量级MVCphp框架-(三)一个国产轻量级框架Amysql源码分析(2) 进程

    Amysql类 按照我的理解这就是框架的初始化 上代码 class Amysql { public $AmysqlProcess; public function Amysql() { global ...

  9. Centos中安装PHP的PDO MySQL扩展的教程

    PHP Data Objects(PDO)扩展为 PHP 访问数据库定义了一个轻量级的一致接口.实现 PDO 接口的每个数据库驱动可以公开具体数据库的特性作为标准扩展功能.注意利用 PDO 扩展自身并 ...

  10. jquery $.trim()方法使用介绍

    $.trim(str)的作用是去掉字符串首尾空格 $.trim(str) 返回:string: 说明:去掉字符串首尾空格. 示例: 先看个错误代码: <input type="text ...