原创

js字符编码


字符串的Unicode表示法

JavaScript 允许采用 \uxxx 形式表示一个字符。

console.log("呵呵\u{68}")//呵呵h

charAt()

法用于返回指定索引处的字符。索引范围为从 0 到 length() - 1

var str = "hello"
console.log(str.charAt(1)) // e

codePointAt()

方法可返回指定位置的字符的 Unicode 编码。这个返回值是 0 - 65535 之间的整数。 对应ASCII码中的十进制值 与String.fromCharCode(i)可相互转换

var charStr = "袁"
var charCode = charStr.codePointAt() // 34945

超过 \u0000 ~ \uFFFF 之间的字符

Unicode 超过 \u0000 ~ \uFFFF 之间的字符必须用两个双字节的形式表示。

var s = "?";
s.length // 2
s.charAt(0) // 乱码�或者""
s.charAt(1) // 乱码�或者""
s.charCodeAt(0) // 55362
s.charCodeAt(1) // 57271

String.fromCharCode(i)

将ASCII码值转换为字符 与codePointAt()可相互转换

String.fromCharCode(97) // a

codePointAt()

ES6 提供了codePointAt()方法,能够正确处理 4 个字节储存的字符 返回一个字符的32 位的 UTF-16 字符的码点。 对于那些两个字节储存的常规字符,它的返回结果与charCodeAt()方法相同。

let s = '?a';
console.log(s.codePointAt(0)) // 134071
console.log(s.codePointAt(1)) // 57271
console.log(s.codePointAt(2)) // 97

codePointAt()

codePointAt()方法是测试一个字符由两个字节还是由四个字节组成的最简单方法。

function is32Bit(c) {
 return c.codePointAt(0) > 0xFFFF;
}
console.log(is32Bit("?")) // true
console.log(is32Bit("a")) // false

"".codePointAt(0).toString(n)

.codePointAt(0).toString(n) 将字符转为n进制编码

"".codePointAt(0).toString(16) 将字符转为16进制编码

ASCII对应的编码是10进制

与String.fromCodePoint(0x十进制)可相互转换

"a".codePointAt(0).toString(16)//61

String.fromCodePoint()

ES5 提供String.fromCharCode方法,用于从码点返回对应字符,但是这个方法不能识别 32 位的 UTF-16 字符(Unicode 编号大于0xFFFF)。

ES6 提供了String.fromCodePoint方法,可以识别大于0xFFFF的字符,弥补了String.fromCharCode方法的不足。在作用上,正好与codePointAt方法相反。

如果String.fromCodePoint方法有多个参数,则它们会被合并成一个字符串返回

fromCodePoint方法定义在String对象上,而codePointAt方法定义在字符串的实例对象上。

与 "".codePointAt().toString(16) 相互转换

String.fromCodePoint(0x20BB7)// "?"
String.fromCodePoint(0x78, 0x1f680, 0x79) === 'x\uD83D\uDE80y'// true

normalize()

normalize方法可以接受一个参数来指定normalize的方式,参数的四个可选值如下。

  • NFC,默认参数,表示“标准等价合成”(Normalization Form Canonical Composition),返回多个简单字符的合成字符。所谓“标准等价”指的是视觉和语义上的等价。
  • NFD,表示“标准等价分解”(Normalization Form Canonical Decomposition),即在标准等价的前提下,返回合成字符分解的多个简单字符。
  • NFKC,表示“兼容等价合成”(Normalization Form Compatibility Composition),返回合成字符。所谓“兼容等价”指的是语义上存在等价,但视觉上不等价,比如“囍”和“喜喜”。(这只是用来举例,normalize方法不能识别中文。)
  • NFKD,表示“兼容等价分解”(Normalization Form Compatibility Decomposition),即在兼容等价的前提下,返回合成字符分解的多个简单字符。
 '\u004F\u030C'.normalize('NFC').length // 1
  '\u004F\u030C'.normalize('NFD').length // 2

附ASCII码表

附“?”字解析

JavaScript
  • 作者:零三(联系作者)
  • 最后更新时间:2020-04-06 12:45
  • 版权声明:自由转载-非商用-非衍生-保持署名
  • 转载声明:来源地址 https://web03.cn