作为前端需要了解的编码知识

在我们平时的前端开发中,可能用到进制转换的地方并不多,但是我们要往node全栈方向发展,尤其是处理‘流’的时候,进制转换就需要我们了解了,这篇文章且作为开始学习‘流’的开胃菜吧!

1.字符的发展

首先还是要说一下字符的发展,纯计算机专业人员和老司机请跳过这部分。计算机的基本功能其实是对数据进行运算和加工处理,计算机中的数据有两类:数值数据和非数值数据。这两种在计算机中都是用 二进制 表示的,所以这里简单说一下 数制 :

  1. 二进制:每个二进制位只有两个不同的数码0和1,逢二进一,八个二进制位可以组合出256种状态,这被称为一个字节(byte)。
  2. 八进制:八进制位拥有八个不同的数码0~7,逢8进1。
  3. 十进制:十进制数就是我们日常所见的由0~9组成的数。
  4. 十六进制十六进制位有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 007F0xxxxxxx
0000 0080-0000 07FF110xxxxx 10xxxxxx
0000 0800-0000 FFFF1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

3.JS进制转换方法

------十进制转其他-------
var a = 24;
a.toString(2);//11000
a.toString(8);//30
a.toString(16);//18
------其他转十进制-------
var b=11000,c=30,d=18;
console.log(parseInt(b, 2)); // 二进制转十进制
console.log(parseInt(c, 8)); // 八进制转十进制
console.log(parseInt(d, 16));// 十六进制转十进制

复制代码

4.前端需要注意的编码问题

在使用nodeJS编写前端工具时,对文本文件的操作比较多,这就涉及到了文件的编码问题,常用的文本编码有UTF8和GBK两种,并且UTF8文件还可能带有BOM(字节顺序标记),在读取不同编码的文本文件时,需要将文件内容转换为JS使用的UTF8编码字符串后才能正常处理。

一、BOM的移除

BOM用于标记一个文本文件使用Unicode编码,其本身是一个Unicode字符("\uFEFF"),位于文本文件头部。在不同的Unicode编码下,BOM字符对应的二进制字节如下:

BytesEncoding
FE FFUTF16BE
FF FEUTF16LE
EF BB BFUTF8

所以我们可以通过文件头的几个字节来判断文件是否包含BOM以及使用哪种Unicode,如果读取文件的时候不去掉BOM,假如我们将几个JS文件合并成一个,如果文件中含有BOM字符,就会导致语法错误,所以我们用 nodeJS读取文件是一般先去掉BOM

var bin = fs.readFileSync(pathname);//通过node 中fs模块同步读文件内容
//判断文件头的字节
if (bin[0] === 0xEF && bin[1] === 0xBB && bin[2] === 0xBF) {
    bin = bin.slice(3);
}
复制代码
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');
}
复制代码

———————————————————记录前端路上的一点一滴

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值