字符编码、进制

  • 字符编码

英文字母、数字、字符  →  十进制  →   二进制

英文字母、数字、字符  →  ASCII码  →  01010101(每八位代表一个字符)每一位0或1所占的空间为比特(bit),这是计算机最小的表示单位。ASCII码只能表示 255 个符号

8bit = 1bytes(字节),这是计算机最小的存储单位,缩写表示为1B。1KB = 1024B,1MB = 1024KB ...

中文  →  十进制  →  二进制

中文  →  GB2312  →  01010101   仅能存储7000+个图形字符,其中汉字有6700+个

中文  →  GBK1.0 、GBK18030   →  01010101  兼容GB2312

中文、英文字母、数字、字符  →   Unicode  →   0101010101010101(规定最少用16位表示,即2个字节)

中文、英文字母、数字、字符  →   UTF-8(兼容Unicode)  →   01010101...(长度可变,ascii码中的内容用1个字节表示、欧洲字符用2个字节表示、东亚用3个字节表示)

Windows 默认编码是GBK,Mac OS/Linux 默认编码是UTF-8

Python2.x默认编码为ASCII码,Python3默认编码是UTF-8

文件开头声明解释器和编码

#!/usr/bin/env python 

# -*- coding: utf-8 -*-

Unicod起到了两个作用:1.直接支持全球所有语言;2.unicode包含了跟全球所有国家编码的映射关系。

但是使用unicode表示一个字符,太浪费空间,为了解决存储和网络传输的问题,就出现了UTF。

UTF-8: 使用1、2、3、4个字节表示所有字符;优先使用1个字符、无法满足则使增加一个字节,最多4个字节。英文占1个字节、欧洲语系占2个、东亚占3个,其它及特殊字符占4个

UTF-16: 使用2、4个字节表示所有字符;优先使用2个字节,否则使用4个字节表示。

UTF-32: 使用4个字节表示所有字符;

即UTF 是为unicode编码 设计 的一种 在存储 和传输时节省空间的编码方案

python 2.x中

 

复制代码
#-*-coding:utf-8-*-
__author__ = 'Alex Li'

import sys
print(sys.getdefaultencoding())


msg = "我爱北京天安门"
msg_gb2312 = msg.decode("utf-8").encode("gb2312")
gb2312_to_gbk = msg_gb2312.decode("gbk").encode("gbk")

print(msg)
print(msg_gb2312)
print(gb2312_to_gbk)
复制代码

在python3.x中

复制代码
#-*-coding:gb2312 -*-   #这个也可以去掉
__author__ = 'Alex Li'

import sys
print(sys.getdefaultencoding())


msg = "我爱北京天安门"
#msg_gb2312 = msg.decode("utf-8").encode("gb2312")
msg_gb2312 = msg.encode("gb2312") #默认就是unicode,不用再decode,喜大普奔
gb2312_to_unicode = msg_gb2312.decode("gb2312")
gb2312_to_utf8 = msg_gb2312.decode("gb2312").encode("utf-8")

print(msg)
print(msg_gb2312)
print(gb2312_to_unicode)
print(gb2312_to_utf8)
复制代码

 

复制代码
#-*-coding:gbk-*-
#文件以GBK编码
import sys

print(sys.getdefaultencoding())

s='你好'#还是默认utf-8
print(s)
print(s.encode('gbk'))
print(s.encode('utf-8').decode('utf-8').encode('gb2312'))
print(s.encode('utf-8').decode('utf-8').encode('gb2312').decode('gb2312'))
>>>
utf-8
你好
b'\xc4\xe3\xba\xc3'
b'\xc4\xe3\xba\xc3'
你好
复制代码

 

  • 进制 

二进制:01010101

八进制:012345678(以0o开头)

十进制:0123456789

十六进制(前缀0x、后缀H):0123456789ABCDEF(以0x开头)

十进制转八进制: oct(a) ,十进制转十六进制: hex(a) 

 

posted @ 2018-04-17 21:52  q1ang  阅读(536)  评论(0编辑  收藏  举报