1 字符编码简介

  ASCII码:美国人发明并使用,用1个字节(8位二进制)代表一个字符,ASCII码是其他任意编码表的子集(utf-16除外).

  Unicode:包含和兼容全世界的语言,与全世界的语言都有映射关系,常用2个字节表示一个字符,1个生僻字用4个字节表示.

  utf-8:可变长编码,英文用1个字节表示,汉字通常是3个字节,生僻字常用4-6个字节表示,uft-8比Unicode编码节省空间和I/O开销.

  关于Unicode和utf-x格式之间的关系,可以认为utf-x是Unicode的一种特殊类型,在存取数据时,内部会自动在Unicode和utf-x之间转换.

  在内存中,统一使用的都是Unicode编码(固定,集成在操作系统中),所以可以转换为任意其他国家自定义的编码(这样就不会乱码);在将数据存入硬盘时,需要将Unicode转换为一种更精准的格式,即utf-8,将数据控制在最精准和节省空间;而磁盘数据读入缓存到内存中时,则需要将utf-8转换为Unicode.

  在python2.x中,默认使用ASCII编码作为字符编码;而在python3.x中,默认使用Unicode作为默认字符编码.

import sys
print(sys.getdefaultencoding())
'ascii' #python2.x默认字符编码
---------------------------------
import sys
print(sys.getdefaultencoding())
'utf-8' #python3.x默认字符编码 
---------------------------------
U=u'阿凡达' #3*3=9字节,8*9=72bytes
U1=bytes(U,'utf-8')
print(U1) # 构造Unicode字符,结果是 b'\xe9\x98\xbf\xe5\x87\xa1\xe8\xbe\xbe',\x代表16进制存储,1个字符代表4byte,18*4=72bytes

1.1 字符编码和解码

  两张图读懂字符编码与解码之间的关系,编码和解码对应,就不会出现乱码了,参考资料及图片来源:

  https://www.cnblogs.com/f-ck-need-u/p/10185965.html

  https://www.cnblogs.com/linhaifeng/articles/5950339.html

编码: str ---> bytes (encode)
解码: bytes ---> str (decode)
二进制格式的数据也常称为裸数据(raw data),str数据经过编码后得到raw data,raw data解码后得到的str.
内存中是unicode-------->encode编码保存-------->utf-8保存到磁盘(二进制)
utf-8磁盘里保存-------->decode解码缓存到内存中---------->unicode内存中
注意: 编码和解码的过程中,与软件指定的编码(字符集)也有关系,必须对应.
######################
print((set(dir(str)))-set(dir(bytes))) #字符串类型只有编码encode()方法,没有解码decode()
print((set(dir(bytes)))-set(dir(str))) #字节串类型只有解码decode()方法,没有编码encode()
--------------------
{'format', 'isdecimal', 'casefold', 'format_map', 'isidentifier', 'isnumeric', 'isprintable', 'encode'}
{'hex', 'decode', 'fromhex'}

1.2 str,bytes,bytearray类型

  str:字符串类型,有序有索引,序列数据,可以迭代取值,但属于不可变类型,底层存储由一个个二进制组成,也就是bytes.python3.x中str默认是Unicode(uft-8)格式编码.

  bytes:字节串类型,二进制字节数据,有序有索引,序列数据,可以迭代取值,也属于不可变类型;将字符串数据存到硬盘的的过程,实质上就是将Unicode转换为utf-8下的二进制字节这样就可以往硬盘存数据(二进制转换为十六进制存),或通过网络方式传输到其他地方.

  bytearray:可变的字节串类型,属于可变的二进制数据(bytes),属于可变类型.

import sys                #python3.x下查看默认字符编码为 utf-8
print(sys.getdefaultencoding()) #结果是 utf-8
----------------------------
B=b'aaa'
print(type(B),B)     #构造bytes类型,需在字符串前加 b ,结果是<class 'bytes'> b'aaa'
----------------------------
B=b'aaa'         # 构造bytearray类型及改值
By=bytearray(B)
print(type(By),By)
print(list(i for i in By))
By[0]=98            #改值
print(By)           #By=b'baa',a子串值已改变
-------构造bytearray结果
<class 'bytearray'> bytearray(b'aaa')
[97, 97, 97]
bytearray(b'baa')

1.3 乱码的原因及解决办法

  文件从内存写到硬盘的操作简称存文件,文件从硬盘读到内存的操作简称读文件.

  乱码的原因:

  1)存文件时就已经乱码(编辑的字符和编辑器设定保存的字符编码不一致)
  2)存文件时不乱码而读文件时乱码(存时的文件字符编码和读时编辑器设定的字符编码不对应)

  解决乱码的办法: 字符按照什么标准而编码的,就要按照什么标准解码,即编码和解码对应.

1.4 python文件头指定字符编码

  为了避免乱码,在python文件中指定解释器和文件头也是一种方法,文件头指定的编码必须跟python文件存储时用的编码一致.

#!/usr/bin/env python        <===指定解释器(限linux)
# -*- coding: utf-8 -*- <===指定字符编码(等同于#coding:utf-8)来将数据读入内存,由python解释器解释执行用的字符编码

  

  

字符编码及字节串bytes类型的更多相关文章

  1. 对于Python中的字节串bytes和字符串以及转义字符的新的认识

    事情的起因是之前同学叫我帮他用Python修改一个压缩包的二进制内容用来做fuzz,根据他的要求,把压缩包test.rar以十六进制的方式打开,每次修改其中一个十六进制字符串并保存为一个新的rar用来 ...

  2. encode_utf8 把字符编码成字节 微信例子

    ##µ¼Èë encode_json decode_json use JSON qw/encode_json decode_json/; print "1111111111111111-\$ ...

  3. encode_utf8 把字符编码成字节 decode_utf8解码UTF-8到字符

    encode_utf8 $octets = encode_utf8($string); Equivalent to "$octets = encode("utf8", $ ...

  4. 字符编码 and 字节和字符串转换(待补充)

    ascii用一个字节(8位二进制)代表一个字符 Unicode常用2个字节(16位二进制)代表一个字符,生僻字需要用四个字节 汉字中已经超出了ASCII编码的范围,用Unicode, Unicode兼 ...

  5. Python中的字符串与字符编码

    本节内容: 前言 相关概念 Python中的默认编码 Python2与Python3中对字符串的支持 字符编码转换 一.前言 Python中的字符编码是个老生常谈的话题,同行们都写过很多这方面的文章. ...

  6. Python【第三篇】文件操作、字符编码

    一.文件操作 文件操作分为三个步骤:文件打开.操作文件.关闭文件,但是,我们可以用with来管理文件操作,这样就不需要手动来关闭文件. 实现原理: import contextlib @context ...

  7. 【转】Python中的字符串与字符编码

    [转]Python中的字符串与字符编码 本节内容: 前言 相关概念 Python中的默认编码 Python2与Python3中对字符串的支持 字符编码转换 一.前言 Python中的字符编码是个老生常 ...

  8. 补充:bytes类型以及字符编码转换

    内容转自小猿圈链接:https://book.apeland.cn/details/41/ 定义 bytes类型是指一堆字节的集合,在python中以b开头的字符串都是bytes类型 b'\xe5\x ...

  9. python集合、字符编码、bytes与二进制

    集合 用括号表示{ },可以包含多个元素,用逗号分割 用途 用于关系运算 集合特点 1.每个元素是不可变类型 2.没有重复的元素 3.无序 应用 1.set去重 set(names)的功能是将列表转换 ...

随机推荐

  1. React躬行记(16)——React源码分析

    React可大致分为三部分:Core.Reconciler和Renderer,在阅读源码之前,首先需要搭建测试环境,为了方便起见,本文直接采用了网友搭建好的环境,React版本是16.8.6,与最新版 ...

  2. hdu6703 线段树+set

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6703 给你一个数组两种操作.操作一是将pos位置的数字加上10000000:操作二是给你个r和k,问你 ...

  3. 20191014Java课堂记录

    1. Java字段初始化的规律 首先执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”. 其次执行类的构造函数. 类的初始化块不接收任何的参数,而且只要一创建类的对象,它 ...

  4. 「 从0到1学习微服务SpringCloud 」11 补充篇 RabbitMq实现延迟消费和延迟重试

    Mq的使用中,延迟队列是很多业务都需要用到的,最近我也是刚在项目中用到,就在跟大家讲讲吧. 何为延迟队列? 延迟队列就是进入该队列的消息会被延迟消费的队列.而一般的队列,消息一旦入队了之后就会被消费者 ...

  5. 【javaScript】加减乘除的精确计算

    在js中使用"+"."-"等符号进行运算会出现很大的误差,所以需要自己创建函数进行精确运算. //说明:javascript的加法结果会有误差,在两个浮点数相加 ...

  6. xlwings API Documentation

    http://docs.xlwings.org/en/stable/api.html Top-level functions xlwings.view(obj, sheet=None) Opens a ...

  7. beta版本发布说明与总结

    1.发布说明: 软件介绍: deta版本的发布最终是一个可安装使用的窗体程序,已经由Alpha版本的应用解决方案完成到一个程序: deta版本解决了Alpha版本遗留的软件技术方面错误问题,以及针对有 ...

  8. 《即时消息技术剖析与实战》学习笔记10——IM系统如何应对高并发

    一.IM 系统的高并发场景 IM 系统中,高并发多见于直播互动场景.比如直播间,在直播过程中,观众会给主播打赏.送礼.发送弹幕等,尤其是明星直播间,几十万.上百万人的规模一点也不稀奇.近期随着武汉新型 ...

  9. Docker底层架构之网络实现

    前言 Docker 的网络实现其实就是利用了 Linux 上的网络命名空间和虚拟网络设备(特别是 vethpair). 基本原理 首先,要实现网络通信,机器需要至少一个网络接口(物理接口或虚拟接口)来 ...

  10. Docker底层架构之控制组

    概述 控制组(cgroups)是 Linux 内核的一个特性,主要用来对共享资源进行隔离.限制.审计 等. 只有能控制分配到容器的资源,才能避免当多个容器同时运行时的对系统资源的竞争. 控制组技术最早 ...