ES6-字符串的扩展-16进制

简介: es6记录

为什么'\u{1F680}'==='\uD83D\uDE80'

首先需要了解JS代码里面的unicode编码字符的语法是:\uXXXX.这种表示法只能记录码点在\u0000~\uFFFF之间(即0~65535)的字符,超出这个范围的字符,必须用两个双字节的形式表示.
对于大于0xFFFF(即65535 0x即16进制)的字符,先减去0x10000(即65536),然后转换为20bit的二进制数,然后分别填充两个码点空出的10bit,这就是需要两个码点字符的保存方式。

码点一: 0b110110(0b即二进制)
码点二: 0b110111

但是为什么是这两个码点呢?这与Unicode编码的设计者的设计有关.
Unicode编码0xD800-0xDFFF,共2048个码位,是一个被称作代理区(Surrogate)的特殊区域.代理区的目的用两个UTF-16字符表示0~0xFFFF(即0~65535)以外的字符。所有大于0xFFFF的码需要使用代理区的码点。

目前Unicode最大的码位是0x10FFFF(即1114111)

0x010000-0x10FFFF,需要使用2个代理码元表示,第一个码元为0xD800-0xDBFF(高位)范围是:1101 1000 0000 0000到1101 1011 1111 1111,第二个码元为0xDC00-0xDFFF(低位)范围是:1101 1100 0000 0000到1101 1111 1111 1111.

十进制 Unicode编码 说明 说明
55296-56191 0xD800-0xDB7F(896个) High Surrogates 高位替代
56192-56319 0xDB80-0xDBFF(128个) High Private Use Surrogates 高位专用替代
56320-57343 0xDC00-0xDFFF(1024个) Low Surrogates 低位替代

接下来我们把Unicode编码>65535的记为U,我们先计算U'=U-0x10000,然后将U'写成二进制形式:yyyy yyyy yyxx xxxx xxxx,那么U的UTF-16编码(二进制)就是:110110yyyyyyyyyy110111xxxxxxxxxx.

了解前边两个码点后,那么 0x1F680如果用两个双字节表示呢

  1. 先计算0x1F680-0x10000 结果为 0xF680

     (0x1F680-0x10000).toString(16)
    

    image.png

  2. 0xF680转化为2进制结果为0b1111 0110 1000 0000

     0xf680.toString(2)
    

    image.png

  3. 将上一步结果补全为20位的二进制数0b0000 1111 0110 1000 0000(前面加4个0)

  4. 填充两个码点空出的10bit,第一个码点填充为0b1101 1000 0011 1101 第二个码点填充为0b1101 1110 1000 0000
  5. 将两个填充后的码点转化为十六进制即为0xD83D0xDE80.
    image.png

'\u{1F680}'==='\uD83D\uDE80'

参考:
阮一峰 ECMAScript 6 (ES6) 标准入门教程 第三版
Unicode 编码理解

目录
相关文章
|
存储 PHP 数据库
新手教程 快速部署PbootCMS到本地或者服务器
新手教程 快速部署PbootCMS到本地或者服务器
2032 0
|
4月前
|
安全 Java Shell
Java模块化编程(JPMS)简介与实践
本文全面解析Java 9模块化系统(JPMS),帮助开发者解决JAR地狱、类路径冲突等常见问题,提升代码的封装性、性能与可维护性。内容涵盖模块化核心概念、module-info语法、模块声明、实战迁移、多模块项目构建、高级特性及最佳实践,同时提供常见问题和面试高频题解析,助你掌握Java模块化编程精髓,打造更健壮的应用。
|
4月前
|
安全 数据可视化 API
什么是低代码?为什么低代码开发很重要?
低代码开发是一种通过可视化工具和少量编码快速构建应用程序的方法,帮助企业提升开发效率、降低成本,应对开发人员短缺问题。它让非专业开发者也能参与应用创建,同时让专业开发者更专注于复杂项目。低代码平台支持业务流程自动化、客户体验优化等多类应用开发,助力企业加速数字化转型。
|
存储 算法 Cloud Native
C++ bcrypt算法 字符串加密,亲测有效
C++ bcrypt算法 字符串加密,亲测有效
|
12月前
|
XML JSON 网络协议
【网络原理】——拥塞控制,延时/捎带应答,面向字节流,异常情况
拥塞控制,延时应答,捎带应答,面向字节流(粘包问题),异常情况(心跳包)
|
Ubuntu
Ubuntu禁止内核自动更新
通过上述步骤,您可以在Ubuntu系统中有效地禁用内核的自动更新。这些步骤包括锁定内核版本、禁用自动更新配置、移除不需要的内核包以及禁用相关的自动更新服务。这样可以确保系统在内核层面保持稳定,避免因内核自动更新导致的不必要问题。
3086 1
|
存储 JavaScript 前端开发
箭头函数和普通函数在性能方面有什么区别
【10月更文挑战第27天】箭头函数和普通函数在性能方面各有特点,箭头函数在某些场景下具有一定的性能优势,但在实际开发中,不能仅仅为了追求性能而盲目地选择箭头函数或普通函数,应该根据具体的应用场景、代码可读性和可维护性等多方面因素综合考虑来选择合适的函数定义方式。
224 2
|
存储 Kubernetes 负载均衡
掌握Kubernetes:从零到一的集群管理之旅
【10月更文挑战第18天】掌握Kubernetes:从零到一的集群管理之旅
288 0
|
传感器 机器学习/深度学习 运维
|
JavaScript
vue3显示和隐藏元素?
vue3显示和隐藏元素?

热门文章

最新文章