python 常用字符编码

1、几种常用编码

  • ASCII : 不支持中文

  • GBK : 是中国的中文字符,其包含了简体中文和繁体中文的字符

  • Unicode : 万国编码(Unicode 包含GBK)

    • 1) Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码
    • 2) 规定虽有的字符和符号最少由 16 位来表示(2个字节),即:2 **16 = 65536
    • 3)这里还有个问题:使用的字节增加了,那么造成的直接影响就是使用的空间就直接翻倍了
  • Utf-8 : 可变长码, 是Unicode 的扩展集

    • 1) UTF-8编码:是对Unicode编码的压缩和优化,他不再使用最少使用2个字节,而是将所有的字符和符号进行分类
    • 2)ascii码中的内容用1个字节保存、欧洲的字符用2个字节保存,东亚的字符用3个字节保存…

2、python2与python3的几个区别

  • Python2默认 编码方式为ASCII, Python3 默认编码方式为UTF-8(是Unicode 的扩展集)
  • python2中字符串有str和unicode两种类型, python3 中字符串有str和字节(bytes) 两种类型
  • python3中不再支持u中文的语法格式

3、str与字节码(bytes): python3中字符串两种类型

比如定义变量: s = “人生苦短”

  1. s是个字符串,python3中字符串本身存储的就是字节码
  2. 如果这段代码是在解释器上输入的,那么这个s的格式就是解释器的编码格式,对于windows的cmd而言,就是gbk。
  3. 如果将段代码是保存后才执行的,比如存储为utf-8,那么在解释器载入这段程序的时候,就会将s初始化为utf-8编码。
  4. bytes是一种比特流,它的存在形式是01010001110这种,但为了在ide环境中让我们相对直观的观察,它被表现成了b’\xe4\xb8\xad\xe6\x96\x87’这种形式

4、unicode与str : python2中字符串两种类型

  1. 我们知道unicode是一种编码标准,具体的实现标准可能是utf-8,utf-16,gbk …
  2. python 在内部使用两个字节来存储一个unicode,使用unicode对象而不是str的好处,就是unicode方便于跨平台

5、python2和python3中编码转换

  1. 在python3中字符串默认是unicode所以不需要decode(),直接encode成想要转换的编码如gb2312
  2. 在python2中默认是ASCII编码,必须先转换成Unicode,Unicode 可以作为各种编码的转换的中转站
    在这里插入图片描述

6、python2和python3中字符编码转换举例

1. python2进行字符编码转换

  • 例1: python2在文件中进行字符编码转换
#!/usr/bin/env python
#-*- coding:utf8 -*-

ss = '北京市'
#1、第一步先将utf8的字符串解码成unicode:  str ----> Unicode
#注:因为上面声明了使用utf8所以这里必须制定用utf8格式才能decode解码成Unicode
unicode_type = ss.decode('utf8')          # 将utf8的str格式转换成 unicode编码
print type(unicode_type)                  # type变成:<type 'unicode'>

#2、第二步将unicode转换成gbk
gbk_type = unicode_type.encode('gbk')     # 将'unicode' encode编码成gbk格式的str
print gbk_type.decode('gbk')             # 只有将gbk格式的str再deode 解码成 unicode才能显示 "北京市"
# print type( gbk_type.decode('gbk') )    # 能正常显示的只有:<type 'unicode'> 格式
  • 例2: python2在Windows CMD窗口中进行字符编码转换
>>> ss = '北京市'
>>> us = ss.decode('gbk')          # 将gbk格式的str解码成unicode
>>> us2 = us.encode('utf8')        # 将unicode变成utf8格式的str
>>> us3 = us2.decode('utf8')       # 由于cmd中默认是gbk所以要先显示正常汉子,还需要解码成Unicode
>>> print us3
北京市

>>> print type(us3)
<type 'unicode'>
  1. python3进行字符编码转换
import sys
print(sys.getdefaultencoding())       #在python3中打印出默认字符编码: utf-8

s = "你好"
print(s.encode("gbk"))               #将Unicode转换为gbk:  b'\xc4\xe3\xba\xc3'
print(s.encode("utf-8"))             #将Unicode转换为utf-8:   b'\xe4\xbd\xa0\xe5\xa5\xbd'
print(s.encode("utf-8").decode("utf-8").encode("gb2312").decode("gb2312"))
# 1.  s.encode("utf-8")                                                           #将Unicode编码为utf-8
# 2.  s.encode("utf-8").decode("utf-8")            #将utf-8解码为Unicode在解码时必须指定现在的字符编码“utf-8”
# 3.  s.encode("utf-8").decode("utf-8").encode("gb2312")                          #将Unicode编码为”gb2312”
# 4.  s.encode("utf-8").decode("utf-8").encode("gb2312").decode("gb2312")         #将gb2312解码为unicode
# 注1:encode("utf-8")   encode作用是将Unicode编码编码为指定编码(这里的utf-8是要编码成什么)
# 注2:decode(“utf-8”)   decode作用是将其他编码转化为Unicode编码(这里的utf-8是指定现在是什么编码)

7、顶部的:# -- coding: utf-8 --或者# coding: utf-8目前有三个作用

1. 如果代码中有中文注释,就需要此声明。

2. 比较高级的编辑器会根据头部声明,将此作为代码文件的格式。

3. 程序会通过头部声明,解码初始化 u"人生苦短",这样的unicode对象,(所以头部声明和代码的存储格式要一致)。

8、python2 字符编码使用原则

1. decode early: 在输入或者声明字符串的时候,尽早地使用decode方法将字符串转化成unicode编码格式;

2. unicode everywhere: 然后在程序内使用字符串的时候统一使用unicode格式进行处理,比如字符串拼接等操作

3. encode late: 最后,在输出字符串的时候(控制台/网页/文件),通过encode方法将字符串转化为你所想要的编码格式,比如utf-8等

9、UnicodeDecodeError 解决方法

reload(sys)
      sys.setdefaultencoding(‘utf-8’)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hsw Come on

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值