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. java 支持分词的高性能拼音转换工具,速度是 pinyin4j 的两倍

    pinyin pinyin 是 java 实现的高性能中文拼音转换工具. 变更日志 创作目的 想为 java 设计一款便捷易用的拼音工具. 如何为 java 设计一款高性能的拼音转换工具 pinyin ...

  2. 关于SDWebImage的一点小坑

        做项目遇到一个问题,是用sd加载图片,明明本地有图片,使用sd的内部方法也可以拿到那些个图片,但是就是加载缓慢,如果网络还行,网络加载图片都比加载本地图片快.而使用[[SDImageCache ...

  3. Python中的open()方法总结

    总结Python中的open()方法 message= {'企业即时通信': 'aaa', '企业名称': 'bbb'} with open("..\\r.txt", " ...

  4. MVEL2.0的使用实例(一)

    本文是对java整合mvel2.0的一点示例: 如果表达式中有变量,解析表达式时必须传一个map MVEL.eval(expression, vars); /** * 基本解析表达式 */@Testp ...

  5. Elasticsearch 开箱指南

    内容概要 ES 基础介绍,重点是其中的核心概念. 基础 API 实践操作. 1. 基础介绍 Elasticsearch (ES) 是一个数据库,提供了分布式的.准实时搜索和分析. 基于 Apache ...

  6. 总是在起头可是能怎么办呢 Python数据分析

    目录 前言1 第1章准备工作5 本书主要内容5 为什么要使用Python进行数据分析6 重要的Python库7 安装和设置10 社区和研讨会16 使用本书16 致谢18 第2章引言20 来自bit.l ...

  7. nodejs 执行 最近 发现 nodejs 执行的 是非等待的。

    上一步结果 没有完成 下一步就执行了 结果就 不行

  8. 从O365中获取users到D365中

    用D365 online可能会遇到这样的问题.  顾客需要获取O365 user的email address 发email使用. 但是又不想给这部分的users licenses. 那我们就可以通过g ...

  9. excle 写入数据库

    龙龙博客:https://www.cnblogs.com/meilong/p/cao-zuoexcel-mo-kuaiopenpyxl.html 1 安装 pip install openpyxl 如 ...

  10. mysql --->mysql 外键总结

    mysql 外键总结 1.设置外键MySQL ERROR 1005 错误 MySQL ERROR 1005 (主要是约束不一样导致的)例如: 1.两表外键的引用类型不一样,如主键是int外键是char ...