我们在网页上看到的文字实体在计算机中是以二进制来进行存储的,在计算机进行磁盘的读写时,需要对实体文字和二进制进行转换,因此我们需要有规则来规定每个实体文字存储在计算机中是怎么样的。
有这样三个与字符编码相关的概念:
- 字库表:
包含了实体的文字- 编码字符集:
指定了每个实体文字在字库表中的位置。例如ASCII,Unicode等就是字符集,前者主要用于英文等西方文字,后者几乎包含了所有国家的文字。- 字符编码
将实体文字按照某种方式转换成存储在计算机中的数据。一般就是直接将字符在字库表中的位置作为值进行编码。不同的编码方式对字符集的实现不同,造成编码后所得值和在计算机中占据的字节数也不同。例如utf-8采用的是变长编码, 一个英文字母占一个字节,一个汉字占3个字节。
编码的过程就是将实体文字一个个在字符集中查找,找到对应的编码值(通常就是它在字符集中的排位),用这个编码值来替代实体文字。计算机会将这个编码值以二进制的形式存储在磁盘中。
解码就是根据编码的值在字符集中查找,找到对应的实体文字。
再联系nodejs中的Buffer理解一下。JS擅长处理字符串,本身没有处理二进制数据的能力,node提供的Buffer调用了C++中的接口?能够处理二进制数据。通常在new一个buffer的时候需要指定字符编码方式(默认是utf8),即:
得到了实体文字在字符集中的编码值:
var buf = new Buffer('hello', 'base64'); // 85 e9 65
当要把编码数据转换成字符串时(解码),也需要指定解码的方式:
var str = buf.toString('base64'); //hello
这篇文章写的很好:
十分钟搞清字符集和字符编码
Node.js中使用Buffer编码、解码二进制数据详解