编码与解码

二进制、八进制、十六进制

简单地说,就是逢二进一,逢八进一,逢十六进一。
识别方式

  1. 二进制数据最好识别,除了0就是1的就是。
    八进制通常在开头加0b 作为标志。
    1
    2
    3
    python
    >bin(16)
    0b10000
  2. 八进制数据(base‐8),包括0‐7。
    八进制通常在开头加0 作为标志。
    例如: 16(十进制)的八进制为20。写出来就是020
    用python转换: print oct(16)
  3. 十六进制(base‐16),包括0‐9,A‐F,不区分大小写。
    它的标志是0x
    例如:44(十进制)的十六进制为2c,写出来就是0x2c
    用python,十进制转十六进制: print hex(44)
    用shell命令,字符串转十六进制: echo data | xxd ‐p
    十六进制转字符串: echo data | xxd ‐r ‐p

    Base‐36

    包括0‐9,A‐Z。不区分大小写,字母要么全部都是大写,要么全部都是小写,A=a。
    base36很少用,不然在python中也会像上面的进制转换一样,直接用一个函数就能转换了。
    首先需要安装base36模块,然后
    1
    2
    3
    4
    >>>import base36
    >>> import base36
    >>> assert base36.dumps(19930503) == 'bv6h3'
    >>> assert base36.loads('bv6h3') == 19930503

    Base‐64

    包括A‐Z、a‐z、0‐9、+、/(26*2+10+2=64)
    base64经常用在网络传输中。因为网络协议们是有着很久远的历史,支持的字符很少,安全性也是完全没有考虑过的事情。
    为了传送一些不支持的字符,就编码一下。
    a的ascii码是97,97的二进制是1100001
    b的ascii码是98,98的二进制是1100010
    所以ab的二进制就是1100001 1100010
    把这串二进制以6位分组,就是11000 011100 010
    然后再转换为十进制,11000的十进制是24,24再转换为ascii码。
    末尾特殊规定:最后010 的二进制是2,但是2的ascii码不在A‐Z,a‐z,0‐9那些64字符中,最小的A的ASCII码为65。
    所以,010干脆用=代替,只要最后一位很小,不能用ascii码表示的,就用=表示。
    base64的特征有末尾的==(经常有,但也可能没有=)。
    在linux环境,经常用
    1
    echo '需要解码的base64数据' | base64 ‐d

    URL编码

    通常出现在url地址上,方便传输(空格等字符不方便传输)。
    包括%和十六进制数。
    特征:就是%,当你看到如下字符,就能立即反应过来这是url编码的字符。每个字符由三位组成,%和两位十六进制数,这个十六进制数是某个ASCII码转换而成的。
    1
    %E6%96%87%E7%AB%A0/%E5%8D%9A%E5%AE%A2%E5%A4%87%E4%BB%BD/%E5%A4%87%E4%BB%BD/%E8%99%9A%E6%8B%9F%E6%9C%BA%E5%AE%9E%E9%AA%
    python编码
    解码
    print urllib.unquote('%D6%D0%CE%C4')

HTML实体编码

在html(超文本传输协议)中,有些字符用编程的术语来说就是“标识符”。标识符是预定义的,而我们写代码的时候不能把变量名起名为标识符。所以
html编码就是把“标识符”用“实体”代替。
html实体编码的特征:包括& ; 和英文小写字母字符。
特征:
 <>

ASCII

美国信息交换标准码
Unicode是ASCII码的扩展,用2个字节,宽字符集。
php escape() 函数
可对字符串进行编码,这样就可以在所有的计算机上读取该字符串。
_escape函数括号里的字符串是_必需的,是要**被转义或编码**的字符串

该方法不会对ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码:*** @ - _ + . /**。其他所有的字符都会被转义序列替换。

utf‐8 编码与unicode

例子

1
\xe6\xaf\x8f\xe4\xb8\xaa\xe6\xb5\xae\xe7\x82\xb9\xe5\xaf\x84\xe5\xad\x98\xe5\x99\xa8\xe8\x99\xbd\xe7\x84\xb6\xe6\x9c\x898\xe5\xad\

utf-8又叫做8‐bit Unicode Transformation Format,直译就是可变长度的unicode。
ascii码是美国人发明的,只包括英文字符和一些符号,无法表达其他国家的文字。
unicode是为了解决其他国家的字符问题。可想而知,全世界有上百个国家,而一个国家至少有1套字符,所以unicode需要用更长的01101101数据,来代表一个字符。

那么问题来了,如果一个英文文本,如果是unicode格式,那么在网络上传输的话,比ASCII格式的长度要大很多!
有人又说了,那么我转换为ASCII码格式不就行了嘛?

但是,如果是中英文混合呢?比如说一篇医学技术论文,中文里夹杂英文专业术语?如果转为ASCII码,那中文不就乱码了吗?

为了解决这个传输问题。utf-8编码出现了,如果是ASCII码里的,就用ASCII码里的,如果不是,就用unicode里的。可以简单理解为(ASCII+unicode)等于utf-8

?中文与utf-8编码的关系。

(ASCII+unicode)约等于utf-8
中文字符是unicode的子集。所以可以说,中文可以用utf-8表示。
?unicode转utf-8

1
2
3
4
python
a='Metasploit\u6e17\u900f\u5b9e\u4f8b\u8bb2\u89e3' str类型
b=a.decode('unicode_escape') unicode类型,在linux中,可以用print直接输出中文
c=b.encode('utf-8') utf-8类型,在python中,即str类型

unicode只有转换为str(utf-8)才能用url编码传输。

  • ?中文转为URL编码

    在linux中,中文都是utf-8编码的。用quote()函数即可完成转换。
  • ?URL编码转为u ‐8
    如果要显示为中文,用print函数直接输出即可。
    print urllib.unquote(b)

gbk与utf-8

在unicode出现之前,各个国家都有自己的编码方式,gbk就是中文的编码方式(话说中国和台湾用的不是同一种编码,悄声说)
windows的中文就是用的gbk编码,而linux的中文用的就是utf-8编码,所以文本复制时候,可能会乱码。
linux命令,gbk转utf‐8;如果转回来,gbk和utf‐8交换位置即可。
xx.txt是gbk格式文档,final是成功转换的utf‐8文档。
iconv ‐f gbk ‐t utf‐8 xx.txt > final.txt