JavaScript 字符

79 阅读3分钟

1.ASCII介绍:

计算机内部,信息最终都会转化成二进制存储的,而一个字节是八位,共有28(256)个状态,上世纪60年代,美国制定了一套字符编码即英语字符与二进制之间的关系进行了统一规定,这个就是ASCII码。

ASCII码一共规定了128个字符,这些字符只占据了一个字节的后面7位,最前面的一位统一规定为0.

2.Unicode介绍和应用:

基本概念:

英文用128个字符就够了,但世界那么大,其他国家的语言表示128个字符肯定是不够用的,就比如中文,所以unicode就出来了,它就是一个很大的集合,将世界上所有的符号都纳入其中,每个符号都给予独一无二的编码。

产生问题:

unicode只是一个字符集,它只规定了符号的二进制代码,但并没有规定这个二进制如何存储。因此就有了UTF-8,UTF-16,UTF-32等编码方式

3.UTF-8介绍

基本介绍:

UTF-8 就是在互联网上使用最广的一种 Unicode 的实现方式,比如Web网站上的我们通常会写charset=utf-8 就是以utf-8方式存储,为什么utf-8使用广泛,因为其可以变长的编码方式它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

存储方式:

单字节:对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。

多字节:对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。

注意:Unicode在范围 D800-DFFF 中不存在任何字符

Unicode字符范围

UTF-8编码方式

utf-8字节数

0x0000-0x007F 

 0xxxxxxx

1

0x0080-0x07FF 

110xxxxx 10xxxxxx

2

0xD800-0xDFFF

0x0800-0xD7FF和0xE000-0xFFFF

1110xxxx 10xxxxxx 10xxxxxx

3

0x010000- 0x10FFFF

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

4

计算UTF-8编码方式的字节数:

function GetByte(str){
    for(let s of str){
        let num = s.codePointAt(0);
        if(num<=0x007f){
            console.log(s,"1个字节");
        }else if(num<=0x07ff){
            console.log(s,"2个字节")
        }else if(num<=0xffff){
            console.log(s,"3个字节");
        }else{
            console.log(s,"4个字节");
        }
    }
}

4.UTF-16介绍

utf-16结合变长和定长的特点,以2个字节或四个字节为一个字符映射,它分为基本平面 ,码点范围为0x0000-0xFFFF和辅助平面码点范围0x010000-0x10FFFF,对于基本平面采用两个字节存储,其0xD800-0xDBFF是空段没有字符映射,对于辅助平面,unicode编码大于0xFFFF的,将分为两段,前十位放在基本平满0xD800-0xDB00这个空段内,称为高位(H),后十位放在另两个字节上,范围在0xDC00-0xDFFF,称为低位(L)。

转码公式:

//c为十六进制码点
H = Math.floor((c-0x10000) / 0x400)+0xD800
L = (c - 0x10000) % 0x400 + 0xDC00

计算字符串字符个数:

let s = "𠮷𠮷𠮷𠮷严您哈的abc123中国您好";
function StrLength(str){
    let num = 0x0000,
    total = 0;
    for(let i =0;i<str.length;){
        num = `0x${str.charCodeAt(i).toString(16)}`
        if(num>=0xD800&&num<=0xDBFF){
            total++
            i+=2;
        }else{
            total++
            i++
        }   
    };
    return total;
}
console.log(s.length) //22
console.log(StrLength(s))  //18

5.字符处理方法

ES5处理方法:

String.fromCharCode(num1,...,numN) 静态方法

参数:码点数值,范围0-65535(0xFFFF)之间,大于其数值的将被截断不进行有效性检查。

返回值:字符串

str.charAt(index)

参数:字符串索引位置,范围0-str.length-1,默认0

返回:返回指定的字符

str.charCodeAt(index)

参数:字符串索引位置,范围0-str.length-1,默认0

返回:码点值,如果索引超出范围,则返回 NaN

ES6处理方法:

String.fromCodePoint(num1,...,numN) 静态方法

参数:码点

返回:使用指定的 Unicode 编码位置创建的字符串

str.codePointAt(pos)

参数:这个字符串中需要转码的元素的位置

返回:从字符返回对应的码点