Python基础⑵

1 . 格式化输出

1、整数的输出
%o —— oct 八进制
%d —— dec 十进制
%x —— hex 十六进制

1 >>> print('%o' % 20)
2 24
3 >>> print('%d' % 20)
4 20
5 >>> print('%x' % 20)
6 14

2、浮点数输出
(1)格式化输出
%f ——保留小数点后面六位有效数字
  %.3f,保留3位小数位
%e ——保留小数点后面六位有效数字,指数形式输出
  %.3e,保留3位小数位,使用科学计数法
%g ——在保证六位有效数字的前提下,使用小数方式,否则使用科学计数法
  %.3g,保留3位有效数字,使用小数或科学计数法

1 >>> print('%f' % 1.11)  # 默认保留6位小数
 2 1.110000
 3 >>> print('%.1f' % 1.11)  # 取1位小数
 4 1.1
 5 >>> print('%e' % 1.11)  # 默认6位小数,用科学计数法
 6 1.110000e+00
 7 >>> print('%.3e' % 1.11)  # 取3位小数,用科学计数法
 8 1.110e+00
 9 >>> print('%g' % 1111.1111)  # 默认6位有效数字
10 1111.11
11 >>> print('%.7g' % 1111.1111)  # 取7位有效数字
12 1111.111
13 >>> print('%.2g' % 1111.1111)  # 取2位有效数字,自动转换为科学计数法
14 1.1e+03

3、字符串输出
%s
%10s——右对齐,占位符10位
%-10s——左对齐,占位符10位
%.2s——截取2位字符串
%10.2s——10位占位符,截取两位字符串

1 >>> print('%s' % 'hello world')  # 字符串输出
 2 hello world
 3 >>> print('%20s' % 'hello world')  # 右对齐,取20位,不够则补位
 4          hello world
 5 >>> print('%-20s' % 'hello world')  # 左对齐,取20位,不够则补位
 6 hello world         
 7 >>> print('%.2s' % 'hello world')  # 取2位
 8 he
 9 >>> print('%10.2s' % 'hello world')  # 右对齐,取2位
10         he
11 >>> print('%-10.2s' % 'hello world')  # 左对齐,取2位
12 he

4、 其他

字符串格式代码如下

python 处理六位小数 python输出六位小数_赋值运算符

(2)常用转义字符如下

python 处理六位小数 python输出六位小数_Python_02

2 . 基本运算符

Python算术运算符

以下假设变量: a=10,b=20:

运算符

描述

实例

+

加 - 两个对象相加

a + b 输出结果 30

-

减 - 得到负数或是一个数减去另一个数

a - b 输出结果 -10

*

乘 - 两个数相乘或是返回一个被重复若干次的字符串

a * b 输出结果 200

/

除 - x除以y

b / a 输出结果 2

%

取模 - 返回除法的余数

b % a 输出结果 0

**

幂 - 返回x的y次幂

a**b 为10的20次方, 输出结果 100000000000000000000

//

取整除 - 返回商的整数部分

9//2 输出结果 4 , 9.0//2.0 输出结果 4.0

以下实例演示了Python所有算术运算符的操作:


实例(Python 2.0+)



#!/usr/bin/python 
    
   # -*- coding: UTF-8 -*- 
     
   a 
    =  
   21 
    
   b 
    =  
   10 
    
   c 
    =  
   0 
     
   c 
    =  
   a 
    +  
   b 
    
   print 
     
   " 
   1 - c 的值为: 
   " 
   ,  
   c 
     
   c 
    =  
   a 
    -  
   b 
    
   print 
     
   " 
   2 - c 的值为: 
   " 
   ,  
   c 
     
   c 
    =  
   a 
    *  
   b 
    
   print 
     
   " 
   3 - c 的值为: 
   " 
   ,  
   c 
     
   c 
    =  
   a 
    /  
   b 
    
   print 
     
   " 
   4 - c 的值为: 
   " 
   ,  
   c 
     
   c 
    =  
   a 
    %  
   b 
    
   print 
     
   " 
   5 - c 的值为: 
   " 
   ,  
   c 
     
   # 修改变量 a 、b 、c 
    
   a 
    =  
   2 
    
   b 
    =  
   3 
    
   c 
    =  
   a 
   ** 
   b 
     
   print 
     
   " 
   6 - c 的值为: 
   " 
   ,  
   c 
     
   a 
    =  
   10 
    
   b 
    =  
   5 
    
   c 
    =  
   a 
   // 
   b 
     
   print 
     
   " 
   7 - c 的值为: 
   " 
   ,  
   c



运行实例 »


以上实例输出结果:


1 - c 的值为: 31
2 - c 的值为: 11
3 - c 的值为: 210
4 - c 的值为: 2
5 - c 的值为: 1
6 - c 的值为: 8
7 - c 的值为: 2


注意:Python2.x 里,整数除整数,只能得出整数。如果要得到小数部分,把其中一个数改成浮点数即可。

>>> 1/2
0
>>> 1.0/2
0.5
>>> 1/float(2)
0.5

Python比较运算符

以下假设变量a为10,变量b为20:

运算符

描述

实例

==

等于 - 比较对象是否相等

(a == b) 返回 False。

!=

不等于 - 比较两个对象是否不相等

(a != b) 返回 true.

<>

不等于 - 比较两个对象是否不相等

(a <> b) 返回 true。这个运算符类似 != 。

>

大于 - 返回x是否大于y

(a > b) 返回 False。

<

小于 - 返回x是否小于y。所有比较运算符返回1表示真,返回0表示假。这分别与特殊的变量True和False等价。

(a < b) 返回 true。

>=

大于等于 - 返回x是否大于等于y。

(a >= b) 返回 False。

<=

小于等于 - 返回x是否小于等于y。

(a <= b) 返回 true。

以下实例演示了Python所有比较运算符的操作:


实例(Python 2.0+)



#!/usr/bin/python 
    
   # -*- coding: UTF-8 -*- 
     
   a 
    =  
   21 
    
   b 
    =  
   10 
    
   c 
    =  
   0 
     
   if 
     
   ( 
     
   a 
    ==  
   b 
     
   ) 
   :  
   print 
     
   " 
   1 - a 等于 b 
   " 
    
   else 
   :  
   print 
     
   " 
   1 - a 不等于 b 
   " 
     
   if 
     
   ( 
     
   a 
    !=  
   b 
     
   ) 
   :  
   print 
     
   " 
   2 - a 不等于 b 
   " 
    
   else 
   :  
   print 
     
   " 
   2 - a 等于 b 
   " 
     
   if 
     
   ( 
     
   a 
    <>  
   b 
     
   ) 
   :  
   print 
     
   " 
   3 - a 不等于 b 
   " 
    
   else 
   :  
   print 
     
   " 
   3 - a 等于 b 
   " 
     
   if 
     
   ( 
     
   a 
    <  
   b 
     
   ) 
   :  
   print 
     
   " 
   4 - a 小于 b 
   " 
     
   else 
   :  
   print 
     
   " 
   4 - a 大于等于 b 
   " 
     
   if 
     
   ( 
     
   a 
    >  
   b 
     
   ) 
   :  
   print 
     
   " 
   5 - a 大于 b 
   " 
    
   else 
   :  
   print 
     
   " 
   5 - a 小于等于 b 
   " 
     
   # 修改变量 a 和 b 的值 
    
   a 
    =  
   5 
    
   b 
    =  
   20 
    
   if 
     
   ( 
     
   a 
    <=  
   b 
     
   ) 
   :  
   print 
     
   " 
   6 - a 小于等于 b 
   " 
    
   else 
   :  
   print 
     
   " 
   6 - a 大于 b 
   " 
     
   if 
     
   ( 
     
   b 
    >=  
   a 
     
   ) 
   :  
   print 
     
   " 
   7 - b 大于等于 a 
   " 
    
   else 
   :  
   print 
     
   " 
   7 - b 小于 a 
   "


以上实例输出结果:


1 - a 不等于 b
2 - a 不等于 b
3 - a 不等于 b
4 - a 大于等于 b
5 - a 大于 b
6 - a 小于等于 b
7 - b 大于等于 a



Python赋值运算符

以下假设变量a为10,变量b为20:

运算符

描述

实例

=

简单的赋值运算符

c = a + b 将 a + b 的运算结果赋值为 c

+=

加法赋值运算符

c += a 等效于 c = c + a

-=

减法赋值运算符

c -= a 等效于 c = c - a

*=

乘法赋值运算符

c *= a 等效于 c = c * a

/=

除法赋值运算符

c /= a 等效于 c = c / a

%=

取模赋值运算符

c %= a 等效于 c = c % a

**=

幂赋值运算符

c **= a 等效于 c = c ** a

//=

取整除赋值运算符

c //= a 等效于 c = c // a

以下实例演示了Python所有赋值运算符的操作:


实例(Python 2.0+)



#!/usr/bin/python 
    
   # -*- coding: UTF-8 -*- 
     
   a 
    =  
   21 
    
   b 
    =  
   10 
    
   c 
    =  
   0 
     
   c 
    =  
   a 
    +  
   b 
    
   print 
     
   " 
   1 - c 的值为: 
   " 
   ,  
   c 
     
   c 
    +=  
   a 
    
   print 
     
   " 
   2 - c 的值为: 
   " 
   ,  
   c 
     
   c 
    *=  
   a 
    
   print 
     
   " 
   3 - c 的值为: 
   " 
   ,  
   c 
     
   c 
    /=  
   a 
     
   print 
     
   " 
   4 - c 的值为: 
   " 
   ,  
   c 
     
   c 
    =  
   2 
    
   c 
    %=  
   a 
    
   print 
     
   " 
   5 - c 的值为: 
   " 
   ,  
   c 
     
   c 
    **=  
   a 
    
   print 
     
   " 
   6 - c 的值为: 
   " 
   ,  
   c 
     
   c 
    //=  
   a 
    
   print 
     
   " 
   7 - c 的值为: 
   " 
   ,  
   c


以上实例输出结果:


1 - c 的值为: 31
2 - c 的值为: 52
3 - c 的值为: 1092
4 - c 的值为: 52
5 - c 的值为: 2
6 - c 的值为: 2097152
7 - c 的值为: 99864



Python位运算符

按位运算符是把数字看作二进制来进行计算的。Python中的按位运算法则如下:

下表中变量 a 为 60,b 为 13,二进制格式如下:


a = 0011 1100

b = 0000 1101

-----------------

a&b = 0000 1100

a|b = 0011 1101

a^b = 0011 0001

~a  = 1100 0011


运算符

描述

实例

&

按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0

(a & b) 输出结果 12 ,二进制解释: 0000 1100

|

按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1。

(a | b) 输出结果 61 ,二进制解释: 0011 1101

^

按位异或运算符:当两对应的二进位相异时,结果为1

(a ^ b) 输出结果 49 ,二进制解释: 0011 0001

~

按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1 。~x 类似于 -x-1

(~a ) 输出结果 -61 ,二进制解释: 1100 0011,在一个有符号二进制数的补码形式。

<<

左移动运算符:运算数的各二进位全部左移若干位,由 <<

a << 2 输出结果 240 ,二进制解释: 1111 0000

>>

右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,>>

a >> 2 输出结果 15 ,二进制解释: 0000 1111

以下实例演示了Python所有位运算符的操作:


实例(Python 2.0+)



#!/usr/bin/python 
    
   # -*- coding: UTF-8 -*- 
     
   a 
    =  
   60 
     
   # 60 = 0011 1100  
    
   b 
    =  
   13 
     
   # 13 = 0000 1101  
    
   c 
    =  
   0 
     
   c 
    =  
   a 
    &  
   b 
   ;  
   # 12 = 0000 1100 
    
   print 
     
   " 
   1 - c 的值为: 
   " 
   ,  
   c 
     
   c 
    =  
   a 
    |  
   b 
   ;  
   # 61 = 0011 1101  
    
   print 
     
   " 
   2 - c 的值为: 
   " 
   ,  
   c 
     
   c 
    =  
   a 
    ^  
   b 
   ;  
   # 49 = 0011 0001 
    
   print 
     
   " 
   3 - c 的值为: 
   " 
   ,  
   c 
     
   c 
    = ~ 
   a 
   ;  
   # -61 = 1100 0011 
    
   print 
     
   " 
   4 - c 的值为: 
   " 
   ,  
   c 
     
   c 
    =  
   a 
    <<  
   2 
   ;  
   # 240 = 1111 0000 
    
   print 
     
   " 
   5 - c 的值为: 
   " 
   ,  
   c 
     
   c 
    =  
   a 
    >>  
   2 
   ;  
   # 15 = 0000 1111 
    
   print 
     
   " 
   6 - c 的值为: 
   " 
   ,  
   c


以上实例输出结果:


1 - c 的值为: 12
2 - c 的值为: 61
3 - c 的值为: 49
4 - c 的值为: -61
5 - c 的值为: 240
6 - c 的值为: 15



Python逻辑运算符

Python语言支持逻辑运算符,以下假设变量 a 为 10, b为 20:

运算符

逻辑表达式

描述

实例

and

x and y

布尔"与" - 如果 x 为 False,x and y 返回 False,否则它返回 y 的计算值。

(a and b) 返回 20。

or

x or y

布尔"或" - 如果 x 是非 0,它返回 x 的值,否则它返回 y 的计算值。

(a or b) 返回 10。

not

not x

布尔"非" - 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。

not(a and b) 返回 False

以上实例输出结果:


实例(Python 2.0+)



#!/usr/bin/python 
    
   # -*- coding: UTF-8 -*- 
     
   a 
    =  
   10 
    
   b 
    =  
   20 
     
   if 
     
   ( 
     
   a 
     
   and 
     
   b 
     
   ) 
   :  
   print 
     
   " 
   1 - 变量 a 和 b 都为 true 
   " 
    
   else 
   :  
   print 
     
   " 
   1 - 变量 a 和 b 有一个不为 true 
   " 
     
   if 
     
   ( 
     
   a 
     
   or 
     
   b 
     
   ) 
   :  
   print 
     
   " 
   2 - 变量 a 和 b 都为 true,或其中一个变量为 true 
   " 
    
   else 
   :  
   print 
     
   " 
   2 - 变量 a 和 b 都不为 true 
   " 
     
   # 修改变量 a 的值 
    
   a 
    =  
   0 
    
   if 
     
   ( 
     
   a 
     
   and 
     
   b 
     
   ) 
   :  
   print 
     
   " 
   3 - 变量 a 和 b 都为 true 
   " 
    
   else 
   :  
   print 
     
   " 
   3 - 变量 a 和 b 有一个不为 true 
   " 
     
   if 
     
   ( 
     
   a 
     
   or 
     
   b 
     
   ) 
   :  
   print 
     
   " 
   4 - 变量 a 和 b 都为 true,或其中一个变量为 true 
   " 
    
   else 
   :  
   print 
     
   " 
   4 - 变量 a 和 b 都不为 true 
   " 
     
   if 
     
   not 
   ( 
     
   a 
     
   and 
     
   b 
     
   ) 
   :  
   print 
     
   " 
   5 - 变量 a 和 b 都为 false,或其中一个变量为 false 
   " 
    
   else 
   :  
   print 
     
   " 
   5 - 变量 a 和 b 都为 true 
   "


以上实例输出结果:


1 - 变量 a 和 b 都为 true
2 - 变量 a 和 b 都为 true,或其中一个变量为 true
3 - 变量 a 和 b 有一个不为 true
4 - 变量 a 和 b 都为 true,或其中一个变量为 true
5 - 变量 a 和 b 都为 false,或其中一个变量为 false



Python成员运算符

除了以上的一些运算符之外,Python还支持成员运算符,测试实例中包含了一系列的成员,包括字符串,列表或元组。

运算符

描述

实例

in

如果在指定的序列中找到值返回 True,否则返回 False。

x 在 y 序列中 , 如果 x 在 y 序列中返回 True。

not in

如果在指定的序列中没有找到值返回 True,否则返回 False。

x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True。

以下实例演示了Python所有成员运算符的操作:


实例(Python 2.0+)



#!/usr/bin/python 
    
   # -*- coding: UTF-8 -*- 
     
   a 
    =  
   10 
    
   b 
    =  
   20 
    
   list 
    =  
   [ 
   1 
   ,  
   2 
   ,  
   3 
   ,  
   4 
   ,  
   5 
     
   ] 
   ;  
   if 
     
   ( 
     
   a 
     
   in 
     
   list 
     
   ) 
   :  
   print 
     
   " 
   1 - 变量 a 在给定的列表中 list 中 
   " 
    
   else 
   :  
   print 
     
   " 
   1 - 变量 a 不在给定的列表中 list 中 
   " 
     
   if 
     
   ( 
     
   b 
     
   not 
     
   in 
     
   list 
     
   ) 
   :  
   print 
     
   " 
   2 - 变量 b 不在给定的列表中 list 中 
   " 
    
   else 
   :  
   print 
     
   " 
   2 - 变量 b 在给定的列表中 list 中 
   " 
     
   # 修改变量 a 的值 
    
   a 
    =  
   2 
    
   if 
     
   ( 
     
   a 
     
   in 
     
   list 
     
   ) 
   :  
   print 
     
   " 
   3 - 变量 a 在给定的列表中 list 中 
   " 
    
   else 
   :  
   print 
     
   " 
   3 - 变量 a 不在给定的列表中 list 中 
   "


以上实例输出结果:


1 - 变量 a 不在给定的列表中 list 中
2 - 变量 b 不在给定的列表中 list 中
3 - 变量 a 在给定的列表中 list 中



Python身份运算符

身份运算符用于比较两个对象的存储单元

运算符

描述

实例

is

is 是判断两个标识符是不是引用自一个对象

x is y, 类似 id(x) == id(y)

is not

is not 是判断两个标识符是不是引用自不同对象

x is not y , 类似 id(a) != id(b)。如果引用的不是同一个对象则返回结果 True,否则返回 False。

注: id() 函数用于获取对象内存地址。

以下实例演示了Python所有身份运算符的操作:


实例(Python 2.0+)



#!/usr/bin/python 
    
   # -*- coding: UTF-8 -*- 
     
   a 
    =  
   20 
    
   b 
    =  
   20 
     
   if 
     
   ( 
     
   a 
     
   is 
     
   b 
     
   ) 
   :  
   print 
     
   " 
   1 - a 和 b 有相同的标识 
   " 
    
   else 
   :  
   print 
     
   " 
   1 - a 和 b 没有相同的标识 
   " 
     
   if 
     
   ( 
     
   a 
     
   is 
     
   not 
     
   b 
     
   ) 
   :  
   print 
     
   " 
   2 - a 和 b 没有相同的标识 
   " 
    
   else 
   :  
   print 
     
   " 
   2 - a 和 b 有相同的标识 
   " 
     
   # 修改变量 b 的值 
    
   b 
    =  
   30 
    
   if 
     
   ( 
     
   a 
     
   is 
     
   b 
     
   ) 
   :  
   print 
     
   " 
   3 - a 和 b 有相同的标识 
   " 
    
   else 
   :  
   print 
     
   " 
   3 - a 和 b 没有相同的标识 
   " 
     
   if 
     
   ( 
     
   a 
     
   is 
     
   not 
     
   b 
     
   ) 
   :  
   print 
     
   " 
   4 - a 和 b 没有相同的标识 
   " 
    
   else 
   :  
   print 
     
   " 
   4 - a 和 b 有相同的标识 
   "


以上实例输出结果:


1 - a 和 b 有相同的标识
2 - a 和 b 有相同的标识
3 - a 和 b 没有相同的标识
4 - a 和 b 没有相同的标识


is 与 == 区别:
is 用于判断两个变量引用对象是否为同一个, == 用于判断引用变量的值是否相等。
 
 
>>> a = [1, 2, 3]
>>> b = a
>>> b is a 
True
>>> b == a
True
>>> b = a[:]
>>> b is a
False
>>> b == a
True

Python运算符优先级

以下表格列出了从最高到最低优先级的所有运算符:

运算符

描述

**

指数 (最高优先级)

~ + -

按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@)

* / % //

乘,除,取模和取整除

+ -

加法减法

>> <<

右移,左移运算符

&

位 'AND'

^ |

位运算符

<= < > >=

比较运算符

<> == !=

等于运算符

= %= /= //= -= += *= **=

赋值运算符

is is not

身份运算符

in not in

成员运算符

not or and

逻辑运算符

以下实例演示了Python所有运算符优先级的操作:


实例(Python 2.0+)



#!/usr/bin/python 
    
   # -*- coding: UTF-8 -*- 
     
   a 
    =  
   20 
    
   b 
    =  
   10 
    
   c 
    =  
   15 
    
   d 
    =  
   5 
    
   e 
    =  
   0 
     
   e 
    =  
   ( 
   a 
    +  
   b 
   ) 
    *  
   c 
    /  
   d 
     
   #( 30 * 15 ) / 5 
    
   print 
     
   " 
   (a + b) * c / d 运算结果为: 
   " 
   ,  
   e 
     
   e 
    =  
   ( 
   ( 
   a 
    +  
   b 
   ) 
    *  
   c 
   ) 
    /  
   d 
     
   # (30 * 15 ) / 5 
    
   print 
     
   " 
   ((a + b) * c) / d 运算结果为: 
   " 
   ,  
   e 
     
   e 
    =  
   ( 
   a 
    +  
   b 
   ) 
    *  
   ( 
   c 
    /  
   d 
   ) 
   ;  
   # (30) * (15/5) 
    
   print 
     
   " 
   (a + b) * (c / d) 运算结果为: 
   " 
   ,  
   e 
     
   e 
    =  
   a 
    +  
   ( 
   b 
    *  
   c 
   ) 
    /  
   d 
   ;  
   # 20 + (150/5) 
    
   print 
     
   " 
   a + (b * c) / d 运算结果为: 
   " 
   ,  
   e


以上实例输出结果:


(a + b) * c / d 运算结果为: 90
((a + b) * c) / d 运算结果为: 90
(a + b) * (c / d) 运算结果为: 90
a + (b * c) / d 运算结果为: 50


3 . 编码问题

阶段一:现代计算机起源于美国,最早诞生也是基于英文考虑的ASCII

  随着计算机越来越流行,厂商之间的竞争更加激烈,在不同的计算机体系间转换数据变得十分蛋疼,人们厌烦了这种自定义造成的混乱。最终,计算机制造商一起制定了一个标准的方法来描述字符。他们定义使用一个字节的低7位来表示字符,并且制作了如上图所示的对照表来映射七个比特的值到一个字符上。例如,字母A是65,c是99,~是126等等, ASCII码就这样诞生了。原始的ASCII标准定义了从0到127 的字符,这样正好能用七个比特表示。

  为什么选择了7个比特而不是8个来表示一个字符呢?我并不关心。但是一个字节是8个比特,这意味着1个比特并没有被使用,也就是从128到255的编码并没有被制定ASCII标准的人所规定,这些美国人对世界的其它地方一无所知甚至完全不关心。其它国家的人趁这个机会开始使用128到255范围内的编码来表达自己语言中的字符。例如,144在阿拉伯人的ASCII码中是گ,而在俄罗斯的ASCII码中是ђ。ASCII码的问题在于尽管所有人都在0-127号字符的使用上达成了一致,但对于128-255号字符却有很多很多不同的解释。你必须告诉计算机使用哪种风格的ASCII码才能正确显示128-255号的字符。

ASCII,一个Bytes代表一个字符(英文字符/键盘上的所有其他字符),1Bytes=8bit,8bit可以表示0-2**8-1种变化,即可以表示256个字符,ASCII最初只用了后七位,127个数字,已经完全能够代表键盘上所有的字符了(英文字符/键盘的所有其他字符),后来为了将拉丁文也编码进了ASCII表,将最高位也占用了。

阶段二:为了满足中文,中国人定制了GBK

  GBK:2Bytes代表一个字符;为了满足其他国家,各个国家纷纷定制了自己的编码。日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr

阶段三:万国码Unicode编码

  后来,有人开始觉得太多编码导致世界变得过于复杂了,让人脑袋疼,于是大家坐在一起拍脑袋想出来一个方法:所有语言的字符都用同一种字符集来表示,这就是Unicode。

Unicode统一用2Bytes代表一个字符,2**16-1=65535,可代表6万多个字符,因而兼容万国语言.但对于通篇都是英文的文本来说,这种编码方式无疑是多了一倍的存储空间(英文字母只需要一个字节就足够,用两个字节来表示,无疑是浪费空间).于是产生了UTF-8,对英文字符只用1Bytes表示,对中文字符用3Bytes.UTF-8是一个非常惊艳的概念,它漂亮的实现了对ASCII码的向后兼容,以保证Unicode可以被大众接受。

在UTF-8中,0-127号的字符用1个字节来表示,使用和US-ASCII相同的编码。这意味着1980年代写的文档用UTF-8打开一点问题都没有。只有128号及以上的字符才用2个,3个或者4个字节来表示。因此,UTF-8被称作可变长度编码。于是下面字节流如下:

    0100100001000101010011000100110001001111

  这个字节流在ASCII和UTF-8中表示相同的字符:HELLO

  至于其他的UTF-16,这里就不再叙述了。

  总结一点:unicode:简单粗暴,所有字符都是2Bytes,优点是字符----->数字的转换速度快,缺点是占用空间大。

       utf-8:精准,对不同的字符用不同的长度表示,优点是节省空间,缺点是:字符->数字的转换速度慢,因为每次都需要计算出字符需要多长的Bytes才能够准确表示。

内存中使用的编码是unicode,用空间换时间(程序都需要加载到内存才能运行,因而内存应该是尽可能的保证快);硬盘中或者网络传输用utf-8,网络I/O延迟或磁盘I/O延迟要远大与utf-8的转换延迟,而且I/O应该是尽可能地节省带宽,保证数据传输的稳定性。

  所有程序,最终都要加载到内存,程序保存到硬盘不同的国家用不同的编码格式,但是到内存中我们为了兼容万国(计算机可以运行任何国家的程序原因在于此),统一且固定使用unicode,这就是为何内存固定用unicode的原因,你可能会说兼容万国我可以用utf-8啊,可以,完全可以正常工作,之所以不用肯定是unicode比utf-8更高效啊(uicode固定用2个字节编码,utf-8则需要计算),但是unicode更浪费空间,没错,这就是用空间换时间的一种做法,而存放到硬盘,或者网络传输,都需要把unicode转成utf-8,因为数据的传输,追求的是稳定,高效,数据量越小数据传输就越靠谱,于是都转成utf-8格式的,而不是unicode。