概述
怎么用计算机存储现实世界的符号(A、1、?、!、…)?
我们知道在计算机内部,数据使用二进制存储在存储设备中,每一个二进制位即bit,有两种状态(0、1)。又规定8个二进制位为一个字节即byte,代表2^8种状态(从00000000到11111111)。
为了使得现实世界中的符号能够用计算机存储,编码应运而生,即使得现实世界每一个符号在计算机中都对应一种二进制状态(由单个或多个字节表示)。
ASCII
ASCII码,规定128个字符的编码(只占用1个字节的后7位,首位为0。即从00000000到01111111)
例如英文字符A的编码为:01000001
Unicode
由于ASCII只编码了128个字符的局限性,不能解决各个地方的语言编码,比如汉字。为此就催生了多种编码方式,这导致了同一种二进制状态可能表示不同的字符编码,如果用不同的编码方式打开一个文件,就可能会出现乱码。为了解决这个问题,Unicode出现了,它将世界上所有的符号都进行编码,每一个符号都赋予一个唯一的二进制编码。
但是它却只进行了编码,却没有规定编码的存储:我们无法区别Unicode和ASCII,因为计算机不知道三个字节表示的是一个Unicde字符还是三个ASCII字符。此外,一个英文字符由一个字节表示就够了,但是如果Unicode规定,每个符号用三个或四个字节表示,那么每个英文字母前二个或三个字节都是0,这对于存储空间来说是极大的浪费。
UTF8
基于Unicode,UTF8解决了Unicode的缺点,采用长度可变的编码方式(使用1到6个字节为一个符号编码)
在UTF8编码中,对于ASCII编码的符号,仍然按照ASCII的规则进行编码存储(只占用1个字节的后7位,首位为0)。对于ASCII码以外部分符号采用多字节存储,即如果一个字符编码包含n个字节,那么第一个字节的前n位为1,n+1位为0,后面8-(n+1)位用于字符编码数据的存储,在第一个字节后面的n-1个字节的前2位为 “10”,后6位用于字符编码数据的存储。
例如 一个汉字占用3个字节,那么在UTF8中的编码格式为:1110_ _ _ _ 10_ _ _ _ _ _ 10_ _ _ _ _ _
参考 http://www.gulixueyuan.com/course/309/task/7718/show
本文深入探讨了字符编码的发展历程,从ASCII到Unicode再到UTF8,解释了每种编码的特点及其实现方式。揭示了计算机如何存储现实世界的符号,并解决了多语言编码冲突的问题。

496

被折叠的 条评论
为什么被折叠?



