字符编码和python使用encode,decode转换utf-8, gbk, gb2312
ASCII码
标准ASCII码使用7位二进制数表示大写或小写字母,数字0到9标点符号以及在美式英语中使用的特殊控制字符。
在标准ASCII码中,最高位(b7)用作奇偶校验位,所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分寄校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。
后128个称为扩展ASCII码。许多基于x86的系统都支持使用扩展(或“高”)ASCII。扩展ASCII 码允许将每个字符的第8 位用于确定附加的128 个特殊符号字符、外来语字母和图形符号。
常见的ASCII码大小:
换行LF为0x0A,回车CR为0x0D,空格为0x20,'0'为0x30,‘A’为0x41,'a'为0x61
查询ASCII技巧,方便查询ASCII码对应的字符:新建一个文本文档,按住ALT+要查询的码值(注意,这里是十进制),松开即可显示出对应字符。例如:按住ALT+97,则会显示出'a'。
扩展ASCII码
扩展ASCII码是从128-255的字符。
Unicode编码
注意:Unicode只是一个符号集,它规定了符号的二进制代码,却没有规定二进制代码如何存储。
所称的Unicode编码指的是UCS编码方式,即直接存入符号的Unicode二进制代码。
UTF-8编码
UTF-8是互联网上使用最广的一种Unicode的实现方式。
UTF-8是一种变长的编码方式,它使用1-4个字节表示一个符号,根据不同的符号选择不同长度的字节表示。
UTF-8的编码规则很简单,只有二条:
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
Unicode符号范围(16进制) | UTF-8编码方式(2进制) |
0000 0000-0000 007F | 0xxxxxxx |
0000 0080-0000 07FF | 110xxxxx 10xxxxxx |
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
跟据上表,解读UTF-8编码非常简单。如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节。
Unicode与UTF-8的转换方式:
在Windows系统最简单的方式是采用记事本打开文档然后选择编码方式另存为。
解决python乱码问题
字符串在python内部中是采用unicode的编码方式,所以其他语言先decode转换成unicode编码,再encode转换成utf8编码。编码是一种用二进制数据表示抽象字符的方式,utf8是一种编码方式。
代码中的字符串编码默认和代码文件编码相同。
python2中的unicode和python3中的str等价。可以查看s.__class__,如果为<class 'str'>则为unicode编码及文本数据,如果为<class 'bytes'>则为utf8编码及二进制数据。str(s, 'utf8')和s.decode('utf8')等价。
如果字符串在代码中被定义为s=u'中文',则s就是python内部编码unicode。
unicode类型再解码会报错。
判断一个字符串是否为unicode方法isinstance(s, unicode),python2中的unicode和python3中的str等价,所以在python3中判断一个字符串是否为unicode方法为isinstance(s, str)。
获取系统默认编码:
import sys
print(sys.getdefaultencoding())
有些IDE输出乱码是因为控制台不能输出字符串的编码不是程序本身的问题。比如windows的控制台是gb2312,则utf8的输出格式不能正确输出。
一种输出格式为gb2312避免乱码的方式:
#coding=utf-8 s='中文' if(isinstance(s, str)):
#s为u'中文'
s.encode('gb2312')
else:
#s为'中文'
s.decode('utf8').encode('gb2312')
采用标准库codecs模块
codecs.open(filename, mode='r', encoding=None, errors='strict', buffering=1)
import codecs
f = codecs.open(filename, encoding='utf-8')
使用上边这种方式读进来utf-8文件,会自动转换为unicode。但必须明确该文件类型为utf8类型。如果是文件中有汉字,不是一个字节一个字节地读而是整个汉字的所有字节读进来然后转换成unicode(猜想跟汉字的utf8编码有关)。
下边的代码也是一种使用codecs的读写方式
#coding=utf-8
import codecs fin = open("test.txt", 'r')
fout = open("utf8.txt", 'w') reader = codecs.getreader('gbk')(fin)
writer = codecs.getwriter('gbk')(fout) data = reader.read(10)
#10是最大字节数,默认值为-1表示尽可能大。可以避免一次处理大量数据
while data:
writer.write(data)
data = reader.read(10)
借鉴:
Python字符串的encode和decode研究心得——解决乱码问题
How to make unicode with python3
Difference between open and codecs.open in python
codecs——Codec registry and base classes
字符编码和python使用encode,decode转换utf-8, gbk, gb2312的更多相关文章
- 字符编码,pyton中的encode,decode,unicode()
1.在计算机处理的程序中,对字符的处理有两种方式:编码或译码(encoding),解码(decoding) encoding:将字符串中的字符转换到对应编码字符集对应的代码点 ...
- 字符编码和Python代码操作文件
字符编码和Python代码操作文件 读写模式之a模式 # a模式 只追加模式 # 路径不存在:自动创建 with open(r'a.txt','a',encoding='utf8') as f: pa ...
- 字符编码和python中的文件处理
字符编码与python文件处理 ---------------- 字符编码 1.常见的编码 ASCII: 美国人发明的,只编码英文字母和符号,1个字节. GB2312: 中国人发明的,增加了中文汉字和 ...
- 字符编码和python .encode().decode()方法
字符编码与encode.decode的问题: 用8个开关表示世界万物 ASCII : American Standard Code for Information Interchange,美国 ...
- [Python函数]encode,decode
前言: 我们知道,计算机是以二进制为单位的,也就是说计算机只识别0和1,也就是我们平时在电脑上看到的文字,只有先变成0和1,计算机才会识别它的意思.这种数据和二进制的转换规则就是编码.计算机的发展中, ...
- 字符编码和python文件操作
字符编码和文件操作 目录 字符编码和文件操作 1. 字符编码 1.1 什么是字符编码 1.2 字符编码的发展史 1.2.1 ASCII码 1.2.2 各国编码 1.2.3 Unicode 1.3 字符 ...
- 字符编码,python解释器------总结
目录 1. 编码: 1.字符编码 2. 编码的历史 3. 编码和解码 2. python解释器 解释代码的流程 1. 读取文本到解释器 2. 识别代码(检查语法问题) 3. 往终端打印 1. 编码: ...
- 字符编码到python编辑器流程
字符(存储了信息的东西)编码(): 键盘发送的是电流-->主机(内存)接受到电流(当作010100110101)-->显示屏 接受电流(当作010100110101------->键 ...
- 【转】关于字符编码,你所需要知道的(ASCII,Unicode,Utf-8,GB2312…)
转载地址:http://www.imkevinyang.com/2010/06/%E5%85%B3%E4%BA%8E%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81%EF%BC ...
随机推荐
- BaseAdapter导致notifyDataSetChanged()无效的三个原因及处理方法
原文 http://blog.csdn.net/dawanganban/article/details/21376979 前一段时间在做一个项目的时候遇到了一个关于BaseAdapter的notif ...
- chroot
用途:更改命令的根目录. 语法:chroot Directory Command 描述: 注意:如果新根目录中的特殊文件具有与实际根目录不同的主要和次要设备号,则可能会覆盖文件系统. 只有具有 roo ...
- React 从0开始 消息传递
React笔记 React 数据决定DOM 以往的做法是通过JS去操作DOM 将数据填充 JSX Jsx javascript xml HTML的结构组装到js中 jsx使用style的时候 不能直接 ...
- ASP.NET缓存中Cache过期的三种策略
原文:ASP.NET缓存中Cache过期的三种策略 我们在页面上添加三个按钮并双击按钮创建事件处理方法,三个按钮使用不同的过期策略添加ASP.NET缓存. <asp:Button ID=&quo ...
- CentOS 7 安装 Gitlab
https://segmentfault.com/a/1190000002729796
- Android UI SurfaceView的使用-绘制单个图型或多个图形
新建MyView类继承自SurfaceView: public class MyView extends SurfaceView implements SurfaceHolder.Callback { ...
- 略谈cpu架构种类
一直对x86/i386/i686/x86_64这些东西感觉很不清楚,查些资料,解决部分问题,小记一番. Question1:什么是x86? x86或80x86是英特尔Intel首先开发制造的一种微处理 ...
- org.hibernate.QueryException: could not resolve property: address of:
Hibernate: select count(*) as y0_ from test.course this_ org.hibernate.QueryException: could not res ...
- Intellij Idea的一些配置
1.字体 修改IDEA面板字体:Settings->Appearance-> Override default fonts by(not recommended)选中,选择自己喜欢的字体 ...
- caret彻底的理解css的三角形【通过border】
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...