字符编码笔记

Posted by liyaozr on April 6, 2017

1.关于Unicode

之前虽然知道有这个定义,但是并没有去深入了解过,做这个任务刚好要用到知识,因此把学习的东西记录下来方便以后复习。 以下定义来自维基百科。

Unicode(中文:万国码、国际码、统一码、单一码)是计算机科学领域里的一项业界标准。它对世界上大部分的文字系统进行了整理、编码,使得电脑可以用更为简单的方式来呈现和处理文字。

Unicode编码系统分为编码方式和实现方式两个层次:

1-编码方式

编码方式使用16位的编码空间,也就是每个字符占用2个字节。这样理论上一共最多可以表示216(即65536)个字符。基本满足各种语言的使用。

2-实现方式

Unicode的实现方式不同于编码方式。一个字符的Unicode编码是确定的。但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对Unicode编码的实现方式有所不同。Unicode的实现方式称为Unicode转换格式(Unicode Transformation Format,简称为UTF)。

UTF(Unicode transformation format)Unicode转换格式,是服务于Unicode的,用于将一个Unicode码点转换为特定的字节序列。常见的UTF有

UTF-8 可变字节序列,用1到4个字节表示一个码点

UTF-16 可变字节序列,用2或4个字节表示一个码点

UTF-32 固定字节序列,用4个字节表示一个码点

由于ASCII的局限性,且世界上存在多种编码方式,所以诞生了unicode。它将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码。

2.UTF-8

以下内容来自阮一峰字符编码笔记

UTF-8就是在互联网上使用最广的一种Unicode的实现方式。其他实现方式还包括UTF-16(字符用两个字节或四个字节表示)和UTF-32(字符用四个字节表示),不过在互联网上基本不用。重复一遍,这里的关系是,UTF-8是Unicode的实现方式之一。

UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

UTF-8的编码规则很简单,只有二条:

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

2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码 如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节。

3.Unicode与js

因为任务中我们需要判断中英文,那么~在js中采用的究竟是何种编码方式呢?答案是UCS-2。

UCS-2是一个过时的编码方式,因为它只能编码基本平面(BMP)的码点,在BMP的编码上,与UTF-16是一致的,所以可以认为是UTF-16的一个子集。 为什么js要采用一个过时的编码方式。。因为Brendan Eich在写JS的时候,UTF-16还没问世,所以····

4.js中如何判断字符串的长度:

方法1:

String.prototype.gblen = function() {
    var len = 0;
    for (var i = 0; i < this.length; i++) {
        if (this.charCodeAt(i) > 127 || this.charCodeAt(i) == 94) {
            len += 2;
        } else {
            len++;
        }
    }
    return len;
}

方法2:

function getBLen(str) {
    // 把双字节的替换成两个单字节的然后再获得长度
    if (str == null) return 0;
    if (typeof str != "string") {
        str += "";
    }
    return str.replace(/[^\x00-\xff]/g, "01").length;
}