在我们平时的前端开发中,可能用到进制转换的地方并不多,但是我们要往node全栈方向发展,尤其是处理‘流’的时候,进制转换就需要我们了解了,这篇文章且作为开始学习‘流’的开胃菜吧!
1.字符的发展
首先还是要说一下字符的发展,纯计算机专业人员和老司机请跳过这部分。计算机的基本功能其实是对数据进行运算和加工处理,计算机中的数据有两类:数值数据和非数值数据。这两种在计算机中都是用 二进制 表示的,所以这里简单说一下 数制 :
- 二进制:每个二进制位只有两个不同的数码0和1,逢二进一,八个二进制位可以组合出256种状态,这被称为一个字节(byte)。
- 八进制:八进制位拥有八个不同的数码0~7,逢8进1。
- 十进制:十进制数就是我们日常所见的由0~9组成的数。
- 十六进制十六进制位有16个不同的数码,即0到9,A到F,逢16进1。
- 8位 = 1字节
- 1024字节 = 1K
- 1024K = 1M
- 1024M = 1G
- 1024G = 1T
在C语言中,0开始的表示八进制,0x开始的表示十六进制,并没有二进制的直接表示法,而在JS中,使用0b开始的表示二进制,0o开始的表示八进制,0x的表示十六进制。
2.常见编码
二十一进制码(BCD码):
特点是保留了十进制数的权,而数字则用二进制数码0和1的组合来表示,在需要高精度的计算中BCD编码比较常用(了解)。
ASCII码
是美国信息交换标准委员会制定的7位字符编码,用7位二进制码表示一个字符,一直编到了第127号,可以用不同字节来储存英文,由于只用了一个字节(8位)中的7位,所以最前面一位统一规定为0,计算机中常用一个字节,来存放一个字符的ASCII码。ASCII表
GB2312
随着计算机的发展,后来一些西欧国家用的不是英文,为了保存他们的文字,他们使用127号之后的空位保存新的字母(一个8位的字节可以组合256种状态,ASCII只编到127号),一直编到最后一位255,而且不同国家表示的符号也不一样。中国为了表示汉字,我们把127号之后的符号取消了,一个小于127的字符的意义与原来相同,但两个大于 127 的字符连在一起时,就表示一个汉字,也可以说GB2312是对ASCII的中文扩展。可后来还是不够用,所以后来只要求只要第一个字节是大于127就固定表示这是一个汉字的开始,又增加了近 20000 个新的汉字(包括繁体字)和符号。我们称之为GBK编码。
GB18030 / DBCS
随着中国计算机的发展,在编码中又增加了几千个新的少数民族的字,GBK扩展成了GB18030统称它们叫做DBCS。
Unicode
ISO(国际标准化组织)废弃了所有地区性编码方案,做了一套包括了地球上所有文化、符号以及字母的编码,这是一个很大的集合,可以容纳100多万个符号。ISO规定:必须用两个字节,也就是16位来统一表示所有的字符,无论是半角的英文字母,还是全角的汉字,它们都是统一的一个字符!同时,也都是统一的两个字节。
UTF-8
这应该属于前端最常见的一种编码方式了,为解决Unicode如何在网络上传输的问题,于是面向传输的众多 UTF 标准出现了:
- UTF-8 互联网上使用最广的一种 Unicode 的实现方式,每次以8个位为单位传输数据
- UTF-16就是每次 16 个位
UTF-8 最大的一个特点,就是它是一种变长的编码方式,Unicode一个中文字符占 2 个字节,而UTF-8一个中文字符占3个字节,UTF-8是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 |
3.JS进制转换方法
------十进制转其他-------
var a = ;
a.toString();//11000
a.toString();//30
a.toString();//18
------其他转十进制-------
var b=,c=,d=;
console.log(parseInt(b, )); // 二进制转十进制
console.log(parseInt(c, )); // 八进制转十进制
console.log(parseInt(d, ));// 十六进制转十进制
复制代码
4.前端需要注意的编码问题
在使用nodeJS编写前端工具时,对文本文件的操作比较多,这就涉及到了文件的编码问题,常用的文本编码有UTF8和GBK两种,并且UTF8文件还可能带有BOM(字节顺序标记),在读取不同编码的文本文件时,需要将文件内容转换为JS使用的UTF8编码字符串后才能正常处理。
一、BOM的移除
BOM用于标记一个文本文件使用Unicode编码,其本身是一个Unicode字符("\uFEFF"),位于文本文件头部。在不同的Unicode编码下,BOM字符对应的二进制字节如下:
Bytes | Encoding |
---|---|
FE FF | UTF16BE |
FF FE | UTF16LE |
EF BB BF | UTF8 |
所以我们可以通过文件头的几个字节来判断文件是否包含BOM以及使用哪种Unicode,如果读取文件的时候不去掉BOM,假如我们将几个JS文件合并成一个,如果文件中含有BOM字符,就会导致语法错误,所以我们用 nodeJS读取文件是一般先去掉BOM
var bin = fs.readFileSync(pathname);//通过node 中fs模块同步读文件内容
//判断文件头的字节
if (bin[] === && bin[] === && bin[] === ) {
bin = bin.slice();
}
复制代码
2.GBK转UTF8
NodeJS支持在读取文本文件时,或者在Buffer转换为字符串时指定文本编码,但GBK编码不在NodeJS自身支持范围内,一般我们借助iconv-lite这个三方包来转换编码,首先使用npm下载这个第三方包,读取GBK文件函数如下:
var iconv = require('iconv-lite');
function readGBKText(pathname) {
var myFs = fs.readFileSync(pathname);
return iconv.decode(myFs, 'gbk');
}
复制代码
———————————————————记录前端路上的一点一滴