参考:字符串和编码

Note

A.字符编码

1.计算机处理文本 == 将文本转换为二进制 => 处理

2.8 bit(比特) = 1 byte(字节)

一个字节所能表示的最大的十进制整数是255,也就是二进制的11111111;两个字节 => 65535;四个字节 => 4294967295。

3.编码标准

美国的编码表 => ASCII编码表;中国的编码表(用两个字节表示汉字) => GB2312。

问题:各国有各国的编码,有如此多的编码,就会出现冲突,在多语言混合的文本中,会显示乱码。

解决方法:诞生Unicode。

Unicode vs ASCII:a.Unicode使用两个字节,ASCII使用一个字节。b.ASCII转Unicode,在前面补0.

eg.字符A:ASCII编码 => 01000001;Unicode编码:00000000 01000001。

Unicode的问题:

如果统一成Unicode编码,乱码问题从此消失了。但是,如果你写的文本基本上全部是英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上就十分不划算。

解决方法:使用“可变长编码”UTF-8编码。

UTF-8:根据字符大小编码成1~6个字节 => 英文字母1个;中文3个。

eg.

字符	ASCII	    Unicode	        UTF-8
A 01000001 00000000 01000001 01000001
中 x 01001110 00101101 11100100 10111000 10101101

UTF-8编码的好处:遗留的使用ASCII编码的软件可以在UTF-8下继续工作。

4.计算机系统的字符编码工作:

在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。

内存 => Unicode; 传输 => UTF-8

B.Python的字符串

1.在Python3版本中,使用的是Unicode编码,也就是说它支持多语言。

>>> print('你好')
你好

2.对于单个字符,Python提供了两个函数:a.ord()函数,得到字符的整数表示;b.chr()函数,把编码转换为对应的字符。

ord():

>>> ord('我')
25105
>>> ord('a')
97

chr():

>>> chr(29233)
'爱'
>>> chr(97)
'a'

3.Python的字符串类型是str => 内存中使用Unicode表示 => 一个字符对应多个字节;如果要传输 => 字符以字节byte为单位 => 一个字符对应一个字节。

x = b'ABC'

注意区分'ABC'和b'ABC':'ABC'是str,使用的是Unicode编码;而b'ABC'进行了转换,一个字符对应一个字节(如果字符对应有多个字节,则不能使用ASCII编码,见下一点)。

其实意思就是,对文本进行编码,编码前的字符串是'str',编码后的字符串则是b'str',以字节封装。

4.用Unicode表示的str通过encode()方法可以编码为指定的bytes,编码方式不含Unicode:

>>> 'ABC'.encode('ascii')
b'ABC'
>>> 'ABC'.encode('utf-8')
b'ABC'
>>> '我爱你'.encode('utf-8')
b'\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0'
>>> '我爱你'.encode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)

可以看到,中文是不能用ASCII编码方法进行编码的。

>>> x = b'我爱你'
File "<stdin>", line 1
SyntaxError: bytes can only contain ASCII literal characters.

可以看到,使用语句x = b'[str]',默认将[str]转换为ASCII编码的字符串,再赋值给x。

5.有编码,也就有解码,Python提供decode()方法将编码(以byte为单位)转换为Unicode字符串(以bit为单位):

>>> b'ABC'.decode('ascii')
'ABC'
>>> b'我爱你'.decode('ascii')
File "<stdin>", line 1
SyntaxError: bytes can only contain ASCII literal characters.
>>> b'iloveyou'.decode('ascii')
'iloveyou'
>>> '我爱你'.encode('utf-8')
b'\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0'
>>> b'\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0'.decode()
'我爱你'

6.Python提供了计算字符串str长度的函数len(),当是bstr时,计算的就是字节数。

>>> len('ABC')
3
>>> len(b'ABC')
3
>>> len('我爱你')
3
>>> len(b'\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0'.decode('utf-8')) //对bytes字符串进行解码
3
>>> len('我爱你'.encode('utf-8')) //对字符串“我爱你”进行编码、编码方式utf-8.
9
>>> len(b'\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0')
9

可见,1个中文字符经过UTF-8编码后通常会占用3个字节,而1个英文字符只占用1个字节。

总结:为了避免乱码问题,应当始终坚持使用UTF-8编码对str和bytes进行转换。

Hint:

在Python脚本的前面,一般加上这两句话:

#!/usr/bin/env python3    //使计算机识别出这是一个Python的可执行文件
# -*- coding: utf-8 -*- //告诉Python解释器,按照UTF-8编码读取源代码

同时也要确保你的文本编辑器使用UTF-8编码方式。

格式化

Python使用%来格式化字符串,这一点和C语言一致。

常见的占位符有:

%d	整数
%f 浮点数
%s 字符串
%x 十六进制整数

eg.

#!/usr/bin/env python3

print('Hi, My name is %s' % 'Chen')		# Hint: no ","

print('Ethernet Type: %x, My QQ number: %s' % (0x0800, '952693358'))

print('My Student Number: %d' % 15)
sh-3.2# ./basic1.py
Hi, My name is %s Chen
Ethernet Type: %x, My QQ number: %s (2048, '952693358')
My Student Number: %d 15
sh-3.2# ./basic1.py
Hi, My name is Chen
Ethernet Type: 800, My QQ number: 952693358
My Student Number: 15

注意点:a.在%号前面没有“,”! b.如果字符串中出现%,使用两个%进行转移,即“%%”。

小数点后两位:

print('%.2f' % 3.1415926535)

确定位数,不足补0或空格:

print('%02d' % 1)

输出:
>>> 01 print('2d' % 1) 输出:
>>> [空格]1

作业

小明的成绩从去年的72分提升到了今年的85分,请计算小明成绩提升的百分点,并用字符串格式化显示出'xx.x%',只保留小数点后1位:

#!/usr/bin/env python3

s1 = 72
s2 = 85 r = s2 print('%.1f%%' % r)

2017/1/23

Python学习札记(五) Basic2 字符串和编码的更多相关文章

  1. Python学习笔记五:字符串常用操作,字典,三级菜单实例

    字符串常用操作 7月19日,7月20日 ,7月22日,7月29日,8月29日,2月29日 首字母大写:a_str.capitalize() 统计字符串个数:a_str.count(“x”) 输出字符, ...

  2. Python学习第五堂课

    Python学习第五堂课推荐电影:华尔街之狼 被拯救的姜哥 阿甘正传 辛德勒的名单 肖申克的救赎 上帝之城 焦土之城 绝美之城 #上节内容: 变量 if else 注释 # ""& ...

  3. 【python学习笔记】3.字符串使用

    [python学习笔记]3.字符串使用 字符串是一种序列,素有标准的序列操作对字符串用样适用,字符串是不可以改变 格式化操作符,%,左侧是格式化字符串,右侧是被格式的值,可以是一个值.元组.字典 数值 ...

  4. python入门(9)字符串和编码

    python入门(9)字符串和编码 字符串是一种数据类型,比较特殊的是字符串有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理. 最早的计算机在设计时采用8个比 ...

  5. python学习第五次笔记

    python学习第五次笔记 列表的缺点 1.列表可以存储大量的数据类型,但是如果数据量大的话,他的查询速度比较慢. 2.列表只能按照顺序存储,数据与数据之间关联性不强 数据类型划分 数据类型:可变数据 ...

  6. Python学习(8)字符串

    目录 Python 字符串 Python 访问字符串中的值 Python 字符串更新 Python 转义字符 Python 字符串运算符 Python 字符串格式化 Python 三引号 Unicod ...

  7. python学习笔记(二)、字符串操作

    该一系列python学习笔记都是根据<Python基础教程(第3版)>内容所记录整理的 1.字符串基本操作 所有标准序列操作(索引.切片.乘法.成员资格检查.长度.最小值和最大值)都适用于 ...

  8. Python学习-str与byte类型以及编码

    Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分.文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示.Python 3不会以任意隐式的方式混用str和b ...

  9. Python学习系列提升篇------字符串

    字符串是python学习中重要的内容,在以后的工作中,对字符串的处理也必少不了.下面总结一下关于字符串学习的经验. 1.1 字符串的连接和合并 用‘ + ’连接,将两个字符串相加.       合并, ...

随机推荐

  1. react es6语法 之 “ ... ” (扩展运算符)

    扩展运算符(…)用于取出参数对象中的所有可遍历属性,拷贝到当前对象之中 let bar = { a: 1, b: 2 }; let baz = { ...bar }; // { a: 1, b: 2 ...

  2. 【react读取文件】react发送GET请求读取静态文件

    react中,使用发送请求的方式把static文件夹中的前端可访问的静态文件读取成字符串: 1.new request,需要用到getRequestHeaders组件 2.fetch获取respons ...

  3. 【pentaho】【kettle】【Data Integration】试用

    要做数据分析,领导让研究一下kettle. 先占个坑. 这里有个3.0的文档: http://wenku.baidu.com/link?url=hvw_cOBIXLXSGvftkGhXQic3CLC7 ...

  4. Python并行编程(九):线程通讯queue

    1.基本概念 当线程之间要共享资源或数据的时候,可能变的非常复杂.Python的threading模块提供了很多同步原语,包括信号量,条件变量,事件和锁.如果可以使用这些原语的话,应该优先考虑使用这些 ...

  5. linux 系统性能指标

    一.查看CPU使用情况 cpu使用率反映的是当前cpu的繁忙程度,忽高忽低的原因在于占用cpu处理时间的进程可能处于io等待状态但却还未释放进入wait. 平均负载(loadaverage)是指某段时 ...

  6. node.js---sails项目开发

    http://sailsdoc.swift.ren/ 这里有 sails中文文档 node.js---sails项目开发(1)安装,启动sails node.js---sails项目开发(2)安装测试 ...

  7. TensorFlow学习笔记(二)-- MNIST机器学习入门程序学习

    此程序被称为TF的 Hello World,19行代码,给人感觉很简单.第一遍看的时候,不到半个小时,就把程序看完了.感觉有点囫囵吞枣的意思,没理解透彻.现在回过头来看,感觉还可以从中学到更多东西. ...

  8. JDB调试代码 20165324 何春江

    Java书本程序调试: 课上程序调试

  9. AngularJS 笔记系列(五)过滤器 filter

    过滤器是用来格式化给用户展示的数据的. 在 HTML 中的模板绑定符号{{}} 内通过|符号来调用过滤器. 大写:{{ name | uppercase }} 也可以在 JS 中进行调用$filter ...

  10. 一步一步学EF系列四【升级篇 实体与数据库的映射】

    之前的三张为基础篇,如果不考虑架构问题,做一般的小程序,以足够用了.基本的增删改查也都有了.但是作为学习显然是不够的.通过之前三章的学习,有没有发现这样写有什么问题,有没有觉得繁琐的?可能有人会说,之 ...