在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),一个二进制表示一个字符,这就是编码。
ascii:美国标准信息交换代码(American Standard Code for Information Interchange):英文里的字符比较少,0~9 a~z A~Z以及一些特殊字符,用一个字节就能表示完上面的那些字符,每一个字符用对应一个二进制编码(eg:0x01101011),这就是ascii编码。简单来说就是用一个字节来编码。
unicode:ascii是解决了英文编码,但是中文和其他文字呢,中文8000多个啊,一个字节2的8次方顶多就256个,怎么办?那就多加一个字节:2的16次方。(目前比较实用的unicode版本是用两个字节编码的UCS-2,unicode的版本还在不断更新中,详情见http://www.oschina.net/translate/whats-new-in-unicode-70)。
utf8:unicode能很好的覆盖了全世界的字符,但问题由来了,对于实用英文来说的多家就觉得亏了,原来一个字节表示的字符,现在需要两个字符表示,浪费硬盘和流量,所以他们又搞出了另一套编码:utf-8,英文的还是用一个字节表示,其他的用2到6个字符表示!对于其他语言的国家来说,这又不爽了,但没办法,毕竟计算机就是别人用英文的国家发明的,不爽也得用。
链接:http://www.zhihu.com/question/23374078/answer/65352538
计算机只懂二进制,因此,严格按照unicode的方式(UCS-2),应该这样存储:
I 00000000 01001001
t 00000000 01110100
' 00000000 00100111
s 00000000 01110011
00000000 00100000
知 01110111 11100101
乎 01001110 01001110
日 01100101 11100101
报 01100010 10100101
作者:uuspider
链接:http://www.zhihu.com/question/23374078/answer/65352538
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
UTF-8是这样做的:
1. 单字节的字符,字节的第一位设为0,对于英语文本,UTF-8码只占用一个字节,和ASCII码完全相同;
2. n个字节的字符(n>1),第一个字节的前n位设为1,第n+1位设为0,后面字节的前两位都设为10,这n个字节的其余空位填充该字符unicode码,高位用0补足。
这样就形成了如下的UTF-8标记位:
0xxxxxxx
110xxxxx 10xxxxxx
1110xxxx 10xxxxxx 10xxxxxx
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
... ...
于是,”It's 知乎日报“就变成了:
1. 单字节的字符,字节的第一位设为0,对于英语文本,UTF-8码只占用一个字节,和ASCII码完全相同;
2. n个字节的字符(n>1),第一个字节的前n位设为1,第n+1位设为0,后面字节的前两位都设为10,这n个字节的其余空位填充该字符unicode码,高位用0补足。
这样就形成了如下的UTF-8标记位:
0xxxxxxx
110xxxxx 10xxxxxx
1110xxxx 10xxxxxx 10xxxxxx
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
... ...
于是,”It's 知乎日报“就变成了:
I 01001001
t 01110100
' 00100111
s 01110011
00100000
知 11100111 10011111 10100101
乎 11100100 10111001 10001110
日 11100110 10010111 10100101
报 11100110 10001010 10100101