前端也须要了解的字符发展历史

字节

  • 计算机内部,全部信息最终都是一个二进制值
  • 每个二进制位(bit)有0和1两种状态,所以八个二进制位就能够组合出256种状态,这被称为一个字节(byte)

image

单位

  • 8位 = 1字节
  • 1024字节 = 1K
  • 1024K = 1M
  • 1024M = 1G
  • 1024G = 1T

JavaScript中的进制

1. JavaScript中的进制表示

若是想获得20的值,使用各类进制是如何表示的bash

let a = 0b10100;//二进制(0b表示的是二进制,后面为值)
let b = 0o24;//八进制(0o表示的是八进制,后面为值)
let c = 20;//十进制
let d = 0x14;//十六进制(0x表示的是十六进制,后面为值)
console.log(a );//20
console.log(b);//20
console.log(c);//20
console.log(d);//20
复制代码
2. JavaScript中的进制转换
  • 10进制转任意进制 10进制数.toString(目标进制)
let c = 20;
//10进制转为二进制
console.log(c.toString(2));//10100
//10进制转为八进制
console.log(c.toString(8));//24
//10进制转为十六进制
console.log(c.toString(16));//14
复制代码
  • 任意进制转十进制 parseInt('任意进制字符串', 原始进制)
console.log(parseInt('10100', 2));//20
复制代码

ASCII

最开始计算机只在美国用,八位的字节能够组合出256种不一样状态。0-32种状态规定了特殊用途,一旦终端、打印机赶上约定好的这些字节被传过来时,就要作一些约定的动做,如:网络

  • 赶上0×10, 终端就换行;
  • 赶上0×07, 终端就向人们嘟嘟叫;

又把全部的空格、标点符号、数字、大小写字母分别用连续的字节状态表示,一直编到了第 127 号,这样计算机就能够用不一样字节来存储英语的文字了 这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的一位统一规定为0ui

image

这个方案叫作 ASCII 编码 American Standard Code for Information Interchange:美国信息互换标准代码编码

GB2312

后来西欧一些国家用的不是英文,它们的字母在ASCII里没有为了能够保存他们的文字,他们使用127号这后的空位来保存新的字母,一直编到了最后一位255。好比法语中的é的编码为130。固然了不一样国家表示的符号也不同,好比,130在法语编码中表明了é,在希伯来语编码中却表明了字母Gimel (ג)。 中国为了表示汉字,把127号以后的符号取消了,规定spa

  • 一个小于127的字符的意义与原来相同,但两个大于 127 的字符连在一块儿时,就表示一个汉字;
  • 前面的一个字节(他称之为高字节)从0xA1用到0xF7,后面一个字节(低字节)从 0xA1 到 0xFE;
  • 这样咱们就能够组合出大约7000多个(247-161)*(254-161)=(7998)简体汉字了。
  • 还把数学符号、日文假名和ASCII里原来就有的数字、标点和字母都从新编成两个字长的编码。这就是全角字符,127如下那些就叫半角字符。

把这种汉字方案叫作 GB2312。GB2312 是对 ASCII 的中文扩展。 GB表示国标的意思。code

GBK

后来仍是不够用,因而干脆再也不要求低字节必定是 127 号以后的内码,只要第一个字节是大于 127 就固定表示这是一个汉字的开始,又增长了近 20000 个新的汉字(包括繁体字)和符号。orm

GB18030 / DBCS

又加了几千个新的少数民族的字,GBK扩成了GB18030 通称他们叫作 DBCS Double Byte Character Set:双字节字符集。 在 DBCS 系列标准里,最大的特色是两字节长的汉字字符和一字节长的英文字符并存于同一套编码方案里 各个国家都像中国这样搞出一套本身的编码标准,结果互相之间谁也不懂谁的编码,谁也不支持别人的编码cdn

Unicode

如今来到了最重要的编码方案blog

ISO 的国际组织废了全部的地区性编码方案,从新搞一个包括了地球上全部文化、全部字母和符 的编码! Unicode 固然是一个很大的集合,如今的规模能够容纳100多万个符号。 ISO 就直接规定必须用两个字节,也就是 16 位来统一表示全部的字符,对于 ASCII 里的那些 半角字符,Unicode 保持其原编码不变,只是将其长度由原来的 8 位扩展为16 位,而其余文化和语言的字符则所有从新统一编码。 从 Unicode 开始,不管是半角的英文字母,仍是全角的汉字,它们都是统一的一个字符!同时,也都是统一的两个字节ip

UTF-8

Unicode 在很长一段时间内没法推广,直到互联网的出现,为解决 Unicode 如何在网络上传输的问题,因而面向传输的众多 UTF 标准出现了

  • UTF-8 就是在互联网上使用最广的一种 Unicode 的实现方式
  • UTF-8就是每次以8个位为单位传输数据
  • 而UTF-16就是每次 16 个位
  • UTF-8 最大的一个特色,就是它是一种变长的编码方式
  • Unicode 一个中文字符占 2 个字节,而 UTF-8 一个中文字符占 3 个字节
  • UTF-8 是 Unicode 的实现方式之一

编码规则

  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

function transfer(num) {
  let ary = ['1110', '10', '10'];
  let binary = num.toString(2);
  ary[2] = ary[2]+binary.slice(binary.length-6);
  ary[1] = ary[1]+binary.slice(binary.length-12,binary.length-6);
  ary[0] = ary[0]+binary.slice(0,binary.length-12).padStart(4,'0');
  let result =  ary.join('');
  return parseInt(result,2).toString(16);
}
//万
let result = transfer(0x4E07);//E4B887
复制代码
相关文章
相关标签/搜索