概念
# 码点、键码为十进制数值数据
键码 = 码点 = Unicode键码
0x
0xffff => 代表十六进制数据
进制转换
// 功能:将2-36进制转换为十进制
// data => 必须是字符串
// num => 2-36的整数
parseInt(data,num)
// 功能:将十进制(也可其他进制)数值数据转换为2-36进制的字符串
// data => 十进制(也可其他进制)数值数据
// num => 2-36的整数
data.toString(num)
ES5:
// str => 为字符串类型
// num => 为整数类型(下标),代表字符串第几个字符。不传参数,默认读取第一个字符
// 返回指定位置的字符,若指定位置不存在字符,则返回一个空字符
str.charAt(num)
// str => 为字符串类型
// num => 为整数类型(下标),代表字符串第几个字符。不传参数,默认读取第一个字符
// 返回指定位置的字符键码(十进制码点),若指定位置不存在字符,则返回NaN类型
// 注意:不能正确解析大于65535键码的字符,应该使用ES6中的str.codePointAt来解析
str.charCodeAt(num)
// unicodeX => 为单独的数字Unicode键码(十进制)
// 返回字符串
// 注意:不能正常解析大于65535的Unicode键码,应该使用ES6中的String.fromCodePoint来解析
String.fromCharCode(unicodeX,[unicodeX,unicodeX,...,unicodeX])
ES6:
// str => 为字符串类型
// num => 为整数类型(下标),代表字符串第几个字符。不传参数,默认读取第一个字符
// 返回指定位置的字符键码(十进制码点),若指定位置不存在字符,则返回undefined类型
str.codePointAt(num)
// unicodeX => 十进制键码 或者 0x开始的十六进制
// 返回字符串
String.fromCodePoint(unicodeX,[unicodeX,unicodeX,...,unicodeX])
ES5 与 ES6比较
''.charCodeAt(0) => 55357String.fromCharCode("55357") => '\uD83D'
比较:------------------------------------------------------------------------------
''.codePointAt(0) => 128169String.fromCodePoint("128169") => ''
解码十六进制为十进制
十六进制键码:'0x'+'a'.codePointAt(0).toString(16)
十进制键码:eval("0x61") => 97 或者 new Function("return 0x61")()
unicode编码
十六进制Unicode字符串键码:"\\u"+"a".codePointAt().toString(16).padStart(4,0)
返回:"\\u0061"
十进制字符串键码:eval("'\\u0061'")
注意:直接写 \u 会报错,因为是特殊字符,所以需要转义为 \\u
utf-8编码
十六进制utf-8字符串键码:"\\x"+"a".codePointAt().toString(16)
返回:"\\x0061"
解码字符串:function utf8Decode(str) {return str.replace(/\\x(\w{2,4})/g,(_,$1)=>String.fromCodePoint(parseInt($1,16)))}
编码字符串:function strToUtf8(str){return [...String(str)].map(i=>"\\x"+i.codePointAt().toString(16)).join("")}