python字符串编码理解(转载)
(转载)字符编码和python使用encode,decode转换utf-8, gbk, gb2312
(http://www.cnblogs.com/jxzheng/p/5186490.html)
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避免乱码的方式:

1 #coding=utf-8
2
3 s='中文'
4
5
6 if(isinstance(s, str)):
7 #s为u'中文'
8 s.encode('gb2312')
9 else:
10 #s为'中文'
11 s.decode('utf8').encode('gb2312')

采用标准库codecs模块
codecs.open(filename, mode='r', encoding=None, errors='strict', buffering=1)
1 import codecs
2 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字符串编码理解(转载)的更多相关文章
- 关于python中的字符串编码理解
python2.x 中中间编码为unicode,一个字符串需要decode为unicode,再encode为其它编码格式(gbk.utf8等) 以gbk转utf8为例: s = "我是字符串 ...
- 【转载】不得不知道的Python字符串编码相关的知识
原文地址:http://www.cnblogs.com/Xjng/p/5093905.html 开发经常会遇到各种字符串编码的问题,例如报错SyntaxError: Non-ASCII charact ...
- 不得不知道的Python字符串编码相关的知识
开发经常会遇到各种字符串编码的问题,例如报错SyntaxError: Non-ASCII character 'ascii' codec can't encode characters in posi ...
- python 字符串编码
通过字符串的decode和encode方法 1 encode([encoding,[errors]]) #其中encoding可以有多种值,比如gb2312 gbk gb18030 bz2 zlib ...
- python字符串编码
python默认编码 python 2.x默认的字符编码是ASCII,默认的文件编码也是ASCII. python 3.x默认的字符编码是unicode,默认的文件编码是utf-8. 中文乱码问题 无 ...
- Python字符串编码——Unicode
ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte).也就是 ...
- Python字符串编码问题
编码问题:Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了. ASCII编码和Unicode编码的区别:ASCII编码是1个字节,而Unicode编码通常是2个字节.字母A用ASC ...
- python 字符串编码 ,区别 utf-8 和utf-8-sig
Python 读取文件首行多了"\ufeff"字符串 python读取B.txt文件时,控制台打印首行正常,但是若是用首行内容打开文本的话,就会报错: Traceback (mos ...
- Python字符串编码转换
使用encode()方法编码 str.encode([encoding="utf-8"][,errors="strict"]) str:表示需要转换的字符串 e ...
随机推荐
- Mac连接非22端口linux服务器
Mac连接非22端口linux服务器 原文链接:https://www.cnblogs.com/blog5277/p/9507080.html 原文作者:博客园--曲高终和寡 1:ssh连接 打开终端 ...
- Kinect外包-就找北京动点飞扬软件(长年承接微软Kinect体感项目外包,有大型Kinect案例)
承接Kinect体感企业项目.游戏项目外包 有丰富案例提供演示,可公对公签正规合同,开发票. 我们是北京的公司.专业团队,成员为专业WPF产品公司一线开发人员,有大型产品开发经验: 提供优质的售后服务 ...
- Qt中隐藏滚动条重新实现鼠标滚轮事件wheelEvent
delta()已经被弃用了,QT5中用的是angleDelta(),计算的时候取angleDelta().y()值. #重载方法wheelEvent(self,event),即滚轮事件方法 #---- ...
- 第 9 章 数据管理 - 076 - 使用 Rex-Ray volume
使用 Rex-Ray volume 在 docker1 或 docker2 上执行如下命令创建 volume: rexray volume create --size 2 'C:\share\myda ...
- shell脚本中gsub的应用
(1)文件filename的内容 cat awk_file 1 2 3 $1,200.00 1 2 3 $2,300.00 1 2 3 $4,000.00 (2)去掉第四列的$和,并汇总第四列的和 a ...
- YY的GCD
YY的GCD 给出T个询问,询问\(\sum_{i=1}^N\sum_{j=1}^M(gcd(i,j)\in prime)\),T = 10000,N, M <= 10000000. 解 显然质 ...
- discuss!X3.4 帖子显示昵称而不是用户名的解决办法
问题:dedecmsV5.7和discuz!X3.4整合之后,实现免激活登陆之后,从dede过来的用户在discuz 直接展示的用户名,因为我们的用户名是手机号,所以不想帖子都展示的是用户名. 因为我 ...
- ubuntu nginx ssl 证书配置
前几天自己用 egg.js 写了个 api 接口,然后把它部署到服务器上.服务器是ubuntu 16.04 + nginx:因为要用到https,然后今天实践了一下如何配置https. 关于htt ...
- 用oracle自带的ssh脚本配置互信
./sshUserSetup.sh -user 用户名 -hosts "主机名1 主机名2 主机名3 ..." -advanced -noPromptPassphrase 这个 ...
- IDEA配合Flash CS6开发Flash项目--配置篇
前端篇: 1:下载好IDEA和Flash CS6 2:配置IDEA 打开IDEA,点击创建新项目,选择Flash项目. 一开始没有装Flex SDK的界面会显示红色的none字样,这时需要找到自己下载 ...