字符编码

一、字符编码的演进

  • ASCII
  • GB2312    GBK1.0    GB18030
  • Unicode编码:国际标准字符集,它将世界各种语言的每个字符定义一个唯一的编码,以满足跨语言、跨平台的文本信息转换。Unicode(统一码、万国码)规定所有的字符和符号最少由16位来表示(2个字节),即:2 ** 16 = 65535
  • UTF-8

二、为什么有bytes?
是因为要表示图片、视频等二进制格式的数据

三、如何在python2实现,写一个软件,在全球各国电脑上,都能正常显示?
答:1、以Unicode编码写你的软件,直接在内存里声明变量的时候以Unicode格式
s = u'路飞' #Unicode
2、转成Unicode,文件编码定义的utf-8,读取到内存里还是utf-8编码,所以需要解码转成Unicode
d2 = d.decode("uft-8")
d2 = d.decode("gbk")

四、python2 和python3的区别
py2:str = bytes,Unicode str类型,Unicode类型
py3:str = Unicode,bytes str类型

文件头声明
py2:以uft-8 or GBK 等编码的代码,代码内容加载到内存,并不会被转成Unicode,编码依然是源编码
py3:以utf-8 or GBK 等编码的代码,代码内容加载到内存,会被自动转成Unicode

python2
以utf-8编码的字符串,在Windows上的默认编码是GBK,读取到内存,python2上不会自动转成Unicode编码,所以不能正常显示

python3
字符串的编码改成了Unicode
str就是Unicode格式的字符串
bytes就是单纯的二进制
文件的默认编码变成了utf-8

在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码
用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件

对于单个字符的编码,Python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符

python字符编码演示

一、python2 Windows终端,GBK格式

1、直接在Windows终端输入,定义的变量字符串编码格式应该是GBK

PS C:\Users\martin> python2
Python 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:25:58) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> d = "路飞"         #定义一个变量,因为是在Windows终端定义的,默认编码是GBK,所以该字符串的编码格式为GBK
>>> d
'\xc2\xb7\xb7\xc9'    #这里可以看出来该变量是GBK格式的,GBK编码,一个中文占用两个字节,一个字节用两个十六进制表示,python2里的字符串和字节是等同的
>>> print d
路飞                   #这里没有乱码,是因为该字符串是GBK编码的的,终端的编码格式也是GBK,所以能正常显示
>>> d2 = d.decode()   #python2 内存里默认的解码的编码是ASCII,这里没指定,常用的ASCII最高位为0,而这个字符串是中文,GBK编码,最高位为1,所以ASCII提示无法解码
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 0: ordinal not in range(128)
>>> d2 = d.decode("gbk")      #把字符串以GBK编码解码成Unicode
>>> d2
u'\u8def\u98de'               #Unicode类型,python2中str==byte,有单独的Unicode类型
>>> print d2
路飞                          #虽然这里是GBK编码的终端,但因为所有系统都支持Unicode,所以这里能正常显示
>>> d3 = d2.encode("utf-8")  #将d2以utf-8编码,存储和网络传输一般选择utf-8编码
>>> d3
'\xe8\xb7\xaf\xe9\xa3\x9e'   #uft-8编码一个中文占3个字节
>>> print d3
璺                         #uft-8编码格式的d3读取到内存后,utf-8一个中文占三个字节,终端默认是GBK,GBK一个中文占两个字节,所以显示不正常

2、以文件的方式保存,声明编码格式为utf-8,那里面定义的变量字符串是utf-8编码格式,在python2上运行,查看结果

#!/usr/bin/env python
# -*-coding:utf-8-*-
d = "路飞"
print(type(d))
print(d)

输出:
<type 'str'>       #python2定义的变量为字符串类型,字符串以声明的或默认的编码格式存储字符串
璺               #这里编码格式是utf-8,uft-8一个中文占三个字节,终端默认是GBK,GBK一个中文占两个字节,读取到内存后,GBK无法正确判断对应关系,所以显示不正常d2 = d.decode("utf-8") #这里讲utf-8编码格式解码成Unicode
print(type(d2))
print(d2)

输出:
<type 'unicode'>
路飞                   #虽然这里是GBK编码的终端,但因为所有系统都支持Unicode,所以这里能正常显示d3 = d2.encode("gbk")  #将Unicode编码成GBK格式
print(type(d3))
print(d3)
输出:
<type 'str'>
路飞                   #因为终端就是GBK编码的,所以能正常显示

二、python3 Windows终端 GBK格式
1、直接Windows终端输入

PS C:\Users\martin> python
Python 3.6.3 (v3.6.3:2c5fed8, Oct 3 2017, 17:26:49) [MSC v.1900 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> s = "路飞"            #python3中的字符串是Unicode格式,定义的变量字符串在内存里默认都是Unicode,Unicode编码格式的字符串
>>> type(s)
<class 'str'>
>>> s
'路飞'>>> s2 = s.encode("gbk") #将Unicode以GBK格式编码
>>> type(s2)
<class 'bytes'>
>>> s2
b'\xc2\xb7\xb7\xc9'>>> s3 = s2.decode()        #将GBK格式的编码以默认的编码(uft-8)解码,因为是GBK格式的编码,所以用utf-8解码会报错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb7 in position 2: invalid start byte
>>> s3 = s2.decode("gbk")   #将GBK格式的编码以GBK解码
>>> type(s3)
<class 'str'>
>>> s3
'路飞'>>> s4 = s3.encode()        #以utf-8编码
>>> type(s4)
<class 'bytes'>
>>> s4
b'\xe8\xb7\xaf\xe9\xa3\x9e' #一个中文占三个字节>>> s5 = s4.decode()        #以uf-8解码
>>> type(s5)
<class 'str'>
>>> s5
'路飞'

2、以文件的方式保存,声明编码格式为utf-8

s = "路飞"               #python3中的字符串是Unicode
print(s)
print(type(s))输出:
路飞
<class 'str'>s2 = s.encode("gbk")    # 一个字节占8bit,8bit = 1byte,\x代表十六进制,两个十六进制占一个byte,把s以GBK格式编码成字节类型
print(s2)
print(type(s2))输出:
b'\xc2\xb7\xb7\xc9'
<class 'bytes'>s3 = s2.decode("gbk")  #把字节类型的s3以GBK格式解码成Unicode格式的字符串
print(s3)
print(type(s4))输出:
路飞
<class 'str'>

转载于:https://www.cnblogs.com/jmaly/p/7999343.html

python 字符编码问题相关推荐

  1. Python字符编码详解

    Python字符编码详解 转自http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html Python字符编码详解 本文简单介绍了各种常用的 ...

  2. python字符编码是什么_python3字符编码是什么?怎么用?

    最近一直讲的是python基础方面的知识,小编一直在考虑要不要加大难度.这个问题犹豫了很久,怕一些python小白不能很好的接受知识点.但是最近小编收到不少小伙伴的强烈要求,想要学习编码这个模块的知识 ...

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

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

  4. python字符编码在哪里_快速入手Python字符编码

    前言 对于很多接触python的人而言,字符的处理和语言整体的温顺可靠相比显得格外桀骜不驯难以驾驭. 文章针对Python 2.7,主要因为3对的编码已经有了很大的改善并且实际原理一样,更改一下操作命 ...

  5. python 字符编码处理_浅析Python 字符编码与文件处理

    Python字符编码 目前计算机内存的字符编码都是Unicode,目前国内的windows操作系统采用的是gbk. python2默认的字符编码方式是ASCII python3默认的字符编码方式是Un ...

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

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

  7. 关于python字符编码以下选项中错误的是_关于Python文件打开模式的描述,以下选项中错误的是...

    [单选题]下列Python保留字中,不用于表示分支结构的是 [单选题]下列哪项不是python中文件的读取操作 [单选题]以下程序的输出结果是: s='' ls = [1,2,3,4] for l i ...

  8. python中二进制和文本不同_关于Python字符编码与二进制不得不说的一些事

    二进制 核心思想: 冯诺依曼 + 图灵机 电如何表示状态,才能稳定? 计算机开始设计的时候并不是考虑简单,而是考虑能自动完成任务与结果的可靠性, 简单始终是建立再稳定.可靠基础上 经过尝试10进制,但 ...

  9. 关于python字符编码以下选项中错误的是_关于 Python 字符编码,以下选项中描述错误的是...

    [单选题]下面代码的输出结果是: a = 20 b = a | 3 a &= 7 print(b ,end=",") print(a) [单选题]Python 3.x 版本 ...

最新文章

  1. 模型压缩95%:Lite Transformer,MIT韩松等人
  2. [C# 网络编程系列]专题十:实现简单的邮件收发器
  3. 这周末,清华迎来了最小的学生和最牛的老师,Science都点赞的那种
  4. 一起来庆祝 .NET 20 周年!
  5. 千兆网线8根线定义图_家中的网线断裂/不够长,如何接线才最合适?
  6. Java基本数据类型的转换
  7. CentOS 7 安装Docker
  8. 老李分享:Android性能优化之内存泄漏3
  9. Java视频教程从入门到精通(2021完整版)
  10. Diffusion Model扩散模型原理
  11. java 生成kml文件_java使用dom4j解析大量坐标点的kml文件
  12. c语言课程设计--打飞碟源代码,c语言课程设计_打飞碟提高篇.doc
  13. 【代码笔记】Web-CSS-CSS盒子模型
  14. 施工部署主要不包括_施工部署编制内容不包括( )_学小易找答案
  15. html导出excel加边框,利用js对象Blob导出的excel,有办法把表格的边框给浮现出来...
  16. glsl 抗锯齿锯齿_什么是抗锯齿?
  17. Gsensor/Gyro数据滤波算法思考
  18. 金融领域的数字化转型和科技创新有哪些应用?
  19. 称重仪表显示ol怎么解决_称重仪表显示Erd和数字是怎么回事?
  20. 微信公众号页面如何跳转至关注公众号页面

热门文章

  1. JavaScript面向对象编程
  2. 一致性 hash 算法( consistent hashing )
  3. Asp.Net下通过切换CSS换皮肤
  4. HTTP Response中的Chunked编码
  5. Spring源码分析【8】-MyBatis注解方法不能重载
  6. 服务器架设笔记——打通MySQL和Apache
  7. windows7 64位机上安装配置CUDA7.5(或8.0)+cudnn5.0操作步骤
  8. OpenCV代码提取:flip函数的实现
  9. 【Android】adb命令总结
  10. 【驱动】GPIO寄存器配置总结