Skip to content
📈0️⃣

Unicode 编码

字符的 Unicode 表示法

js 允许采用 \uxxxx 形式表示一个字符, 其中 xxxx 表示字符的 Unicode 码点

例如: '\u0061' 表示字符 'a'

但是, 这种表示只限于 \u0000-\uFFFF 之间的字符; 超出这个范围的字符, 必须用两个双字节的形式表达

例如: '\uD842\uDFB' 表示字符 '🍺'

unicode 码转字符串

  • String.fromCodePoint(n)
js
parseInt('0x1F60A', 16) // 十六进制: 0x1F60A --> 十进制: 128522
String.fromCodePoint(0x1F60A) // '😊'
String.fromCodePoint(128522) // '😊'
String.fromCodePoint('u\{1F60A}') // '😊'
  • String.fromCharCode(n)

  • charCodeAt(n)

  • 直接用 Unicode 编码表示字符串

js
'\u20bb7' // '₻7'
'\u{20bb7}' // '𠮷'
'\u1F60A' // 'ὠA'
'\u{1F60A}' // '😊'
String.fromCodePoint(0x1F60A) === '\u{1F60A}' // true

编码

'U+263A' 是一个 Unicode 码点,下面是对每个字符的解释:

  • U:表示这是一个 Unicode 码点。
  • +:表示后面跟着的是十六进制数。
  • 263A:这是十六进制数,对应的十进制数是 10746。 将这个码点转换为对应的字符后,你会得到一个笑脸符号(😊)。
js
const getCode = (ucode, type = 'es6') => {
  ucode = ucode.includes('+') ? parseInt(ucode.slice(2), 16) : ucode
  const str = type === 'es6' ? String.fromCodePoint(ucode) : String.fromCharCode(ucode)
  return str
}
getCode('U+1F468') // '👨'
getCode('U+1F469') // '👩'
getCode('U+1F468', 'es5') // ''
getCode('U+1F469', 'es5') // ''

fromCharCode()fromCodePoint() 用于将Unicode码点转换为字符串

  1. fromCharCode() 属于ES5中的字符串方法,只能处理两个参数的情况,且这两个参数的范围必须在0至65535之间(即一个UTF-16单元)。超出这个范围的码点会被截断处理。例如,String.fromCharCode(0x1f601) 的输出结果是 "?",而不是我们期望的笑脸符号。这是因为0x1f601超出了单个UTF-16单元的范围,所以高位被截断了。

  2. fromCodePoint() 是ES6新增的方法,能够处理超过0xFFFF的码点,因此可以正确表示那些无法用单个UTF-16单元表示的字符。此外,fromCodePoint() 可以接受多个参数,并将这些参数拼接在一起形成一个新的字符串。例如,String.fromCodePoint(0x1f601, 0x1f601, 0x1f601) 的输出结果是"???"。

总结来说,fromCharCode()fromCodePoint() 的主要区别在于处理参数的能力以及对超出单个UTF-16单元范围的码点的处理方法。fromCharCode() 有范围限制并且不能处理超过范围的码点,而 fromCodePoint() 则无此问题并能处理超过范围的码点。

进制转换

进制英文范围前缀后缀
二进制Binary0-10BB
八进制Octal0-70OO
十进制Decimal0-9D
十六进制Hexadecimal0-9,A-F0xH

二进制转换

js
let num = 255; // 十进制 --> 255
let binary = num.toString(2); // 二进制 --> 11111111 | 0b11111111
let octal = num.toString(8); // 八进制 --> 377 | 0o377
let hexadecimal = num.toString(16); // 十六进制 --> ff  | 0xff
console.log(binary, num, octal, hexadecimal); // 11111111 255 377 ff
0b11111111.toString(); // '255'
(255).toString(); // '255'
0o377.toString(); // '255'
0xff.toString(); // '255'
parseInt(0b11111111, 10) // 255
parseInt(255, 10) // 255
parseInt(0o377, 10) // 255
parseInt(0xff, 10) // 255