Fork me on GitHub

ascii,unicode,utf-8

  • 最近老是碰到关于编码的问题,这里整理清楚,以便后期的学习。

Ascii

  • 上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一的规定,这套字符编码被称为Ascii码。

    这里可以发现每一个字符有三种表示方式去表示它的ascii码值,比如,对于 “ !”,既可以用十进制33,二进制0100001,也可以用十六进制21表示它的ascii值。所以在计算机的内部,“ !”就会表示成二进制的字符串0100001,这也就是它的ascii编码形式。

Unicode

  • 产生背景:由于ascii码只能表示英语字符,对于其他的字符(比如汉字,日语,俄语等语言的字符)无法表示;如果在不同的语言中,同一个二进制数对应着不同的字符,便会导致编码方式的不同,并在计算机内进行转换时产生乱码;此时便需要一个更大的符号集来将世界上各种各样的字符包含进来,并且对于一种字符,只有一种表示方式,这个符号集便是unicode(统一码)。

  • Unicode只是一个符号集,一种规范、标准,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储在计算机上

UTF-8

  • 产生背景:虽然unicode可以将所有的字符包含进去,但是存在两个问题:1、对于一段二进制数,计算机怎么判断这段二进制数表示的是一个多字节的符号还是多个单子节的符号?2、对于英文字母,一个字节表示就行了,如果为了将所有的字符全包含进来,而统一规定每个符号必须要用3或4个字节来表示,那对于英文字母来说,前面的2或3个字节都是0,这样存储时会极大的浪费内存。过了段时间,utf-8来了,问题引刃而解了。
    ####1.特点

  • UTF-8是Unicode的实现方式之一,Unicode的其他实现方式还有 utf-16和utf-32(不过这两种方式不常用);

  • UTF-8是一种变长的编码方式,可以使用1~4个字节表示一个符号,根据符号的不同而变化字节长度
    ####2.编码规则

  • 对于单子节的符号,第一位设为0,后面7位为这个符号的unicode码,所以,对于英文字母,utf-8编码与ascii码相同。

  • 对于n字节的符号(n>1),第一个字节的前n位都设为1),第n+1位设为0,后面字节的前两位一律设为10,这n个字节的其余空位填充该字符unicode码,高位用0补足。

  • 到这里为止,君们应该明白了ascii码、unicode、utf-8之间的区别与联系了吧,稍微总结下:


unicode转换为utf-8形式(以‘严’为例)