# ascll unicode编码

4个字节的字符

ascll 是unicode子集

1kb=1024b 1b就是1字节 8个 二进制位构成1个字节

相当于一个字符,8位=1字节

1字节(Byte)=8位(bit)

一个位就代表一个0或1(即二进制)

bit

位 bit

字节 Byte

字符 1个或多个字节组成

ASCII

UNICODE

utf-8

utf-16

utf-32

utf-8是一种变长的编码方式,它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度; utf-16是,好处在于大部分字符都以固定长度的字节 (2字节) 储存,但UTF-16无法兼容于ASCLL编码; UTF-32(或 UCS-4)是以4个字节的长度固定存储的。

# ASCII

ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号,以及在美式英语中使用的特殊控制字符

# unicode

http://www.unicode.org/charts/PDF/U0000.pdf

NICODE

基本多文种平面 基本多文种平面,BMP(Basic Multilingual Plane),或称第零平面(Plane 0),是Unicode中的一个编码区段。编码从U+0000至U+FFFF。

https://tieba.baidu.com/p/6948560860

http://www.unicode.org/charts/PDF/U0000.pdf

Unicode的平面 Unicode有17个平面,即第0平面(0000-FFFF)到 第16平面(100000-10FFFF)。

第0平面称为BMP(Basic Multilingual Plane)平面,又称为基本多文种平面,第0平面外的平面统称为辅助平面,其范围为0000-FFFF。 第1辅助平面称为SMP(Supplementary Multilingual Plane)平面,又称为多文种补充平面,主要摆放拼音文字及符号,其范围为10000-1FFFF。 第2辅助平面称为SIP(Supplementary Ideographic Plane)平面,又称为表意文字补充平面,其范围为20000-2FFFF。 第3辅助平面称为TIP(Tertiary Ideographic Plane)平面,又称为表意文字第三平面,其范围为30000-3FFFF。 第4至13辅助平面尚未使用。 第14辅助平面称为SSP(Supplementary Special-purpose Plane)平面,又称为特殊用途补充平面,摆放语言标签(Language Tags)和异体字选择器(Variation Selectors),这些都是控制字符,其范围为E0000-EFFFF。 第15辅助平面为私人使用区: 补充私人使用区-A (F0000-FFFFF)

  • Supplementary Private Use Area-A 第16辅助平面为私人使用区: 补充私人使用区-B(100000-10FFFF)
  • Supplementary Private Use Area-B

# uft-8

在UTF-8编码中,ASCII码中的字符还是ASCII码的值,只需要一个字节表示,其余的字符需要2字节、3字节或4字节来表示。

(1) 对于ASCII码中的符号,使用单字节编码,其编码值与ASCII值相同详见:U0000.pdf (opens new window)。其中ASCII值的范围为0~0x7F, 所有编码的二进制值中第一位为0(这个正好可以用来区分单字节编码和多字节编码)。

(2) 其它字符用多个字节来编码(假设用N个字节),多字节编码需满足:第一个字节的前N位都为1,第N+1位为0,后面N-1 个字节的前两位都为10,这N个字节中其余位全部用来存储Unicode中的码位值。

字节数 Unicode UTF-8编码 1 000000-00007F 0xxxxxxx 2 000080-0007FF 110xxxxx 10xxxxxx 3 000800-00FFFF 1110xxxx 10xxxxxx 10xxxxxx 4 010000-10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

UTFXX是Unicode的具体实现方式。

Unicode属于字符集,不属于编码,UTF-8、UTF-16等是针对Unicode字符集的编码。

parseInt('01111110',2) = 126

parseInt('01111110',2).toString(16) = '7e' '\u007E' = ~

'汉'.codePointAt(0) = 27721

(27721).toString(2) = 110110001001001

parseInt('110110001001001',2).toString(16) = 6c49

'\u6c49'

ASCII

utf-16
utf-8

字节

charCodeAt与codePointAt的用法:

相同点:   charCodeAt与codePointAt都是字符串实例上的方法,用途都是用来返回指定索引位字符的Unicode编码。 不同点:    charCodeAt与codePointAt匹配索引位的规则不一样。charCodeAt是根据码元来匹配,codePointAt是根据码点来进行匹配的。

utf Unicode Transformation Format 概念 概念描述 举例

位 bit 位(bit) 来自英文bit,音译为“比特”,表示二进制位。位是计算机内部数据储存的最小单位, 11010100是一个8位二进制数。一个二进制位只可以表示0和1两种状态;两个二进制位可以表示00、01、10、11四种状态;三位二进制数可表示八种状态

字节 Byte 字节(byte) 字节来自英文Byte,音译为“拜特”,习惯上用大写的“B”表示。字节是计算机中数据处理的基本单位。计算机中以字节为单位存储和解释信息,规定一个字节由八个二进制位构成,即1个字节等于8个比特(1Byte=8bit)。八位二进制数最小为00000000,最大为11111111;通常1个字节可以存入一个ASCII码,2个字节可以存放一个汉字国标码。 0x01, 0x45, 0xFA,

字 字(word) 计算机进行数据处理时,一次存取、加工和传送的数据长度称为字(word)。一个字通常由一个或多个(一般是字节的整数位)字节构成。 '1', '中', 'a', '$', '¥',

ASCII码 ASCII (American Standard Code for Information Interchange):美国信息交换标准代码是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。包括26个字母,甚至加上大写和小写,阿拉伯数字,计算机中的控制符(回车啥的)都不超过256个(只有127个)

Unicode 码 Unicode编码点分为17个平面(plane),每个平面包含216(即65536)个码位(code point),而第一个平面称为“基本多语言平面”(Basic Multilingual Plane,简称BMP),其余平面称为“辅助平面”(Supplementary Planes)。其中“基本多语言平面”(0~0xFFFF)中0xD800~0xDFFF之间的码位作为保留,未使用

Unicode编码点分为17个平面(plane),每个平面包含216(即65536)个码位(code point)。17个平面的码位可表示为从U+xx0000到U+xxFFFF,其中xx表示十六进制值从0016到1016,共计17个平面。

uft-8 utf-8是一种变长的编码方式,它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度

8代表的是8位 uft-16

16代表的是16位

uft-32

https://www.qqxiuzi.cn/bianma/zifuji.php

parseInt('FFFF',16) = 15 * 16 * 16 16 +15 * 16 16 +15 * 16 + 15

let strSpecial = "a𠮷c"; strSpecial.split('') [..."a𠮷c"] [..."a𠮷c"].length

'\ud842\udfb7' '𠮷'

一个码点=两个码元

字符串的length属性返回的是码元

https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae

https://decodeunicode.org/en/search/search

https://www.jianshu.com/p/3fcfb26002b6

https://www.lanmper.cn/mysql/t7648

http://www.ruanyifeng.com/blog/2014/12/unicode.html

每个二进制数字0或1就是一个位(bit) 1位=0.125 字节 1字节等于8位即 1Byte=8bit 通常8个二进制位为一个字节(byte) 8(bit)= 1(byte)

一个字节八个比特,就是八个二进制位

一个字节 =两个16进制位 1个Byte = 8个二进制位 1个16进制数 = 4个二进制数位, 2个16进制数 = 8个二进制数位 = 1字节 4个16进制数 = 16个二进制数位 = 2字节

四个二进制数最大表示为15,就是一个16进制数,所以八位可以表示成两个16进制的数! 4bit最大表示为15,就是一个16进制数,所以8bit可以表示成两个16进制的数! 0xF -> 1111 -> 8+4+2+1=15

0xFF -> 11111111

console.log(0x0f) console.log(010)

1.十进制:除表示正负的符号外,以1~9开头,由0~9组成。如 128,+234,-278。 2,八进制:以0开头,由0~7组成的数。如 0126, 050000. 3,十六进制:以0X或0x开头,由0~9,A~F或a~f 组成。如 0x12A, 0x5a000。

汉字区间 \u4e00-\u9fa5

http://t.zoukankan.com/onblog-p-13036324.html

if (!String.prototype.codePointAt) { (function() { 'use strict'; // 严格模式,needed to support apply/call with undefined/null var codePointAt = function(position) { if (this == null) { throw TypeError(); } var string = String(this); var size = string.length; // 变成整数 var index = position ? Number(position) : 0; if (index != index) { // better isNaN index = 0; } // 边界 if (index < 0 || index >= size) { return undefined; } // 第一个编码单元 var first = string.charCodeAt(index); var second; if ( // 检查是否开始 surrogate pair first >= 0xd800 && first <= 0xdbff && // high surrogate size > index + 1 // 下一个编码单元 ) { second = string.charCodeAt(index + 1); if (second >= 0xdc00 && second <= 0xdfff) { // low surrogate // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae return (first - 0xd800) * 0x400 + second - 0xdc00 + 0x10000; } } return first; }; if (Object.defineProperty) { Object.defineProperty(String.prototype, 'codePointAt', { value: codePointAt, configurable: true, writable: true }); } else { String.prototype.codePointAt = codePointAt; } })(); }

charCodeAt charCodeAt() 方法返回 0 到 65535 之间的整数,表示给定索引处的 UTF-16 代码单元。

注意

UTF-16 编码单元匹配能用一个 UTF-16 编码单元表示的 Unicode 码点。

如果 Unicode 码点不能用一个 UTF-16 编码单元表示(因为它的值大于0xFFFF),则所返回的编码单元会是这个码点代理对的第一个编码单元) 。如果你想要整个码点的值,使用 codePointAt()。

String.fromCharCode(65, 66, 67) //10进制. ABC String.fromCharCode(0x41, 0x42, 0x43) // 16进制. ABC String.fromCharCode(0x4eba) // 16进制 人 String.fromCharCode(0x14eba) // 16进制,截断 人 String.fromCharCode(0xD83D, 0xDC31,65) '🐱A' '\uD83DA\uDC31A'.length ??? '\uD83D\uDC31A'.length ???

术语解释

代码单元 :即在具体编码形式中的最小单位。比如 :UTF-16 中,一个代码单元为 16 位,UTF-8 中一个代码单元为 8 位(bit)

具体编码:UTF-8、UTF-16等是针对Unicode字符集的编码。Unicode属于字符集,不属于编码

fromCharCode String.fromCharCode(num1[, ...[, numN]]) 方法接受一系列 UTF-16 代码单元的数字。范围介于 0 到 65535(0xFFFF)之间,大于 0xFFFF 的数字将被截断 返回由指定的 UTF-16 代码单元序列创建的字符串。

注意

如果在指定的位置没有元素则返回 undefined。如果在索引处开始没有 UTF-16 代理对,将直接返回在那个索引处的编码单元。

大于 0xFFFF 的数字将被截断, 例如 String.fromCharCode(0x14eba),因为0x14eba大于0xFFFF,所以截断为String.fromCharCode(0x4eba) ,所以String.fromCharCode(0x14eba)==String.fromCharCode(0x4eba) = 人

术语解释

代理对 Surrogate Pair :是 UTF-16 中用于扩展字符而使用的编码方式,是一种采用四个字节 (两个 UTF-16 编码) 来表示一个字符,称作代理对。

举例

codePointAt codePointAt() 方法返回 一个 Unicode 编码点值的非负整数。

注意

如果在指定的位置没有元素则返回 undefined。如果在索引处开始没有 UTF-16 代理对,将直接返回在那个索引处的编码单元。

术语解释

代理对 Surrogate Pair :是 UTF-16 中用于扩展字符而使用的编码方式,是一种采用四个字节 (两个 UTF-16 编码) 来表示一个字符,称作代理对。

Surrogate pair 是专门用于 UTF-16 的,以向后兼容 UCS-2,做法是取 UCS-2 范围里的 0xD800~0xDBFF(称为 high surrogates) 和 0xDC00~0xDFFF(称为 low surrogates) 的 code point,一个 high surrogate 接一个 low surrogate 拼成四个字节表示超出 BMP 的字符,两个 surrogate range 都是 1024 个 code point,所以 surrogate pair 可以表达 1024 x 1024 = 1048576 = 0x100000 个字符,surrogate pair加上BMP的就是 0x10FFFF,这就是Unicode 的字符集范围上限是 0x10FFFF 的原因。

UCS2就是标准的unicode编码, 它是某国际组织设计的一种文字符号编码表,包括了世界上绝大多数文字和符号,包括中文,每个字符使用2字节编码,因此叫ucs2。

BMP基本多文种平面(Basic Multilingual Plane),或称第零平面(Plane 0),是Unicode中的一个编码区段。编码从U+0000至U+FFFF。

fromCodePoint String.fromCodePoint(num1[, ...[, numN]]) 静态方法接受一串 Unicode 编码位置,即“代码点”,返回使用指定的代码点序列创建的字符串。

术语解释

代理对 Surrogate Pair :是 UTF-16 中用于扩展字符而使用的编码方式,是一种采用四个字节 (两个 UTF-16 编码) 来表示一个字符,称作代理对。

代码

String.fromCodePoint(0x41) A String.fromCodePoint(65) A String.fromCharCode(128049) '你' String.fromCodePoint(0x2F804). '你'

实例练习 JavaScript 内部,字符以 UTF-16(字符用两个字节Byte或四个字节Byte表示) 的格式储存,码点范围介于U+0000到U+FFFF,每个字符固定为2个字节,一个码元。

对于那些需要4个字节储存的字符(Unicode 码点大于0xFFFF的字符),两个码元,JavaScript 会认为它们是两个字符。

特别要注意,码点可以是一个码元,也可以是两个码元

字符串的length属性返回的是码元

0

二进制 0b01100 = 12

八进制 0o14 = 12 字符串 '\43'

十进制 12 = 12

十六进制 0xc = 12

unicode '\u4f60' = 你 16进制 '\x63\x68' = ch 8进制 '\43' = # = String.fromCharCode(parseInt(43,8))

'\x45' '\105' '\u0045' === E