什么是 Unicode
Unicode 是国际组织制定的可以容纳世界上 所有文字和符号的字符编码方案, 它为每种语言中的每个字符设定了统一并且唯一的编码.
表示一个 Unicode 的字符时, 通常会用 "U+" 然后紧接着一组十六进制的数字来表示这一个字符. 比如: U+4E25,U+1F600, U+1F601
那 unicode 和 UTF-8 有何区别?
通俗点就是
Unicode 是字符集
UTF-8 是编码规则
字符集: 为每一个字符分配一个唯一的 ID(学名为码位 / 码点 / Code Point)
编码规则: 将码点转换为字节序列的规则
JS 中如何使用 Unicode
编码:
1. 字符串形式
javaScript 允许采用 \uxxxx 形式表示一个字符, 其中 xxxx 表示字符的 Unicode 码点. 仅限于码点在 \u0000~\uFFFF 之间的字符. 超出这个范围的字符, 必须用两个双字节的形式表示.
- "\u0061" // 'a'
- // es6 表示法(支持超过 0xFFFF 的数值)
- "\u{1F601}"
复制代码
js 方法
- es5: String.fromCharCode(Unicode) (局限于 Unicode 码点不大于 0xFFFF)
- String.fromCharCode(65) //return "A"
复制代码
- es6: String.fromCodePoint(Unicode) (支持 Unicode 码点大于 0xFFFF)
- String.fromCodePoint('0x1F601') // ""
- String.fromCodePoint('128513') // ""
复制代码
解码
- es5: str.charCodeAt() (局限于 Unicode 码点不大于 0xFFFF)
- var str = 'ABC'
- str.charCodeAt(0) // 65
复制代码
- es6: str.codePointAt() (支持 Unicode 码点大于 0xFFFF)
- var str = ""
- str.codePointAt(0) // 128513 10 进制
- str.codePointAt(0).toString(16) // "1f601" 16 进制
复制代码
emoji 的编码
emoji 也是一个 Unicode 字符. 2010 年, Unicode 开始为 Emoji 分配码点.
比如: U+1F4C5,U+1F468, U+1F600 等
Unicode 只是规定了 Emoji 的码点和含义, 并没有规定它的样式. 举例来说, 码点 U+1F600 表示一张微笑的脸, 但是这张脸长什么样, 则由各个系统自己实现.
如果用户的系统没有实现这个 Emoji 符号, 用户就会看到一个没有内容的方框, 因为系统无法渲染这个码点.
截至目前, 共有 2789 个 emoji 字符;
参考链接: emoji-text http://www.unicode.org/Public/emoji/11.0/emoji-test.txt
emoji 组合
Unicode 允许多个码点组合表示一个 Emoji. 通过 零宽度连接符 U+200D 实现.
U+1F468: 男人
U+1F469: 女人
U+1F467: 女孩
比如 U+1F468 U+200D U+1F469 U+200D U+1F467, 就会显示为一个 Emoji
如果用户的系统不支持这种方法, 就还是显示为三个独立的 Emoji
复制代码
零宽连字符 (zero-width-joiner,ZWJ) 是一个不打印字符, 放在某些需要复杂排版语言 (如阿拉伯语, 印地语) 的两个字符之间. 零宽连字符使得这两个本不会发生连字的字符产生了连字效果. 零宽连字符的 Unicode 码位是 U+200D
- // 多码点转成 emoji 组合
- function unifiedToNative(unified) {
- var unicodes = unified.split('-'),
- codePoints = unicodes.map((u) => `0x${u}`)
- return String.fromCodePoint(...codePoints)
- }
- // 多组合 emoji 转成码点
- var s = '';
- for (let ch of s) {
- console.log(ch.codePointAt(0).toString(16)); // 1f469 200d 2764 fe0f 200d 1f469
- }
复制代码
来源: https://juejin.im/post/5b47564b51882519ec07e9ec