计算机是如何存数据的 #

字符a如何表示

进制
十进制 97
二进制 1100001
十六进制 61

进制转换 #

//十进制转其他
var x=97;
console.log(x.toString(8));
console.log(x.toString(16));

//其他转十进制
var x='10';
console.log(parseInt(x,2));
console.log(parseInt(x,8));
console.log(parseInt(x,16));

ASCII 码 #

ASCII码使用指定的7位或8 位二进制数组合来表示128 或256种可能的字符

ASCII

字符集 #

时间 GB 微软 Unicode
1981 GB2312
1993 GBK
2000 Unicode3.0

字符编码 #

字符集规定了字符对应的数字,却没有规定如何存储 字符编码是字符集的存储方式

UTF-8的编码规则只有二条:

  1. 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
  2. 对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
Unicode符号范围 UTF-8编码方式
(十六进制) (二进制)
0000 0000-0000 007F 0xxxxxxx
0000 0080-0000 07FF 110xxxxx 10xxxxxx
0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

已知"严"的unicode是4E25(100111000100101),根据上表,可以发现4E25处在第三行的范围内(0000 0800-0000 FFFF),因此"严"的UTF-8编码需要三个字节,即格式是"1110xxxx 10xxxxxx 10xxxxxx"。然后,从"严"的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,"严"的UTF-8编码是"11100100 10111000 10100101",转换成十六进制就是E4B8A5。

中日韩unicode表

ASCII,Unicode和UTF-8