在计算机的世界里,所有的信息,包括文本、图片、视频等,最终都是以0和1的二进制形式存储在硬件中的。即便是我们日常使用的字符,也不例外。那么,计算机是如何从这些看似杂乱无章的0和1中识别出我们熟悉的字母和符号呢?这就涉及到了编码和解码的过程。
既然涉及到编码和解码,那么编解码双方就必须要约定一套规则。然而出于一些原因,计算机所使用的字符编码并未实现统一,不同的字符编码往往并不兼容。下面,我们先来了解一个容易和它混淆的概念——字符集。
字符集
字符集是一套字符的集合,它为集合内的每个字符指定了一个唯一的编号,称为码点。字符集的大小就代表了其能所表达字符的范围。
最初ASCII编号只包括128字符,这个范围非常小。随着计算机技术的普及,各国为了支持自己国家的语言文字,逐渐制定自己的字符集。比如,用以表明简体字的GB2312字符集和繁体字的Big5字符集。但是,因为这种早期字符集不符统一的标准,这就导致一个问题:不同的字符集不兼容。也就是说,在不同编码系统中,同样的编码值可能代表截然不同的字符。
Unicode字符集的出现解决了这个问题:这将各国的字符统一编写在同一组合中,不同的字符对应不同的码点,那样各国的字符就不会相互冲突。如今,Unicode字符集的使用非常普及,但由于一些历史和政治问题,Unicode字符集最终未能完全取代别的字符集。
字符编码
字符编码不等于字符集。后者只要求组合中的每个字符指定一个唯一的编号,但并未指定其在计算机中的实际编码方式。比如,Unicode字符集对应于三种不同的编码方式:UTF-8编号、UTF-16号和UTF-32号。仅有在计算机中指定了字符集的具体编码方式,字符的表示才有意义。
ANSI编码
ANSI编码实际上是Windows系统里的一个概念,并非一种特定的字符编码,它指代了的是当前Windows系统环境中使用的字符编码。
Windows的诞生早于Unicode字符集,当时为了处理不同字符集间互不兼容的问题,Windows采用了一种称为切换代码页的方式来为当前系统环境指定字符编码。由于Windows代码页最初是根据ANSI草案实现的,因此Windows代码页也被称作ANSI代码页,而代码页实际上就是指的字符编码,所以ANSI代码页又被称为ANSI编码。
在Windows cmd中,使用chcp命令可以查看当前控制台使用的代码页:
不同字符编码引发的问题
我们有时会发现同一个文档在不同的系统环境中打开,里面的部分字符就变成了一些奇怪的符号。出现这种现象是编解码双方使用的字符编码不一致导致的。这在Windows系统和类Unix系统之间出现的较为频繁,因为两个系统使用的默认字符编码不同。Windows系统默认使用ANSI编码,而类Unix系统默认使用UTF-8编码,因此如果不对文档做编码的转换,就很容易出现乱码的问题。
镭速大文件传输软件中的做法
镭速大文件传输软件在开发过程中,除了在使用到Windows系统API的部分,程序内编码都统一转为UTF-8编码。Windows系统由于存在历史包袱,只提供了ANSI编码和UTF-16编码两种编码版本的API,并未直接支持UTF-8编码,所以在程序中需要使用到Windows系统API的地方,都要对字符进行转码。此外,统一使用使用UTF-8编码在网络传输过程中也可以减少很多麻烦。由于UTF-8编码以单字节为编码单元,所以并不涉及到网络字节序的问题。