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 编码理解

目录
相关文章
|
8月前
|
传感器 数据采集 监控
[开源代码]基于STM32的环境检测与报警系统
本项目成功实现了基于STM32的环境检测与报警系统,能够同时监测水位、温度、湿度和亮度,并对每项参数独立设置安全范围,实现报警提示。
[开源代码]基于STM32的环境检测与报警系统
|
机器学习/深度学习 自然语言处理 算法
《Java 情感分析:前沿技术与方法全解析》
在数字化时代,情感分析是提取文本数据价值的关键技术。本文探讨了Java在这一领域的应用,涵盖自然语言处理工具(如Apache OpenNLP、Stanford NLP)、机器学习方法(如朴素贝叶斯、SVM)及深度学习框架(如TensorFlow、Deeplearning4j)。通过这些技术和工具,Java能够高效处理情感分析任务,广泛应用于社交媒体监测、客户反馈分析等场景,尽管仍面临文本多样性与复杂性的挑战。
571 9
|
人工智能 安全 JavaScript
Open Interpreter:AI 赋能终端!在终端中对话AI模型进行编程,通过运行代码来完成各种计算机操作任务
Open Interpreter 是一个让语言模型运行代码的强大工具,提供了一个类似 ChatGPT 的界面,支持多种编程语言和丰富的功能。
1964 7
Open Interpreter:AI 赋能终端!在终端中对话AI模型进行编程,通过运行代码来完成各种计算机操作任务
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
算法 Shell 开发工具
Git 知识点
Git 知识点
2268 0
|
安全 区块链 Android开发
播放器支持商业DRM实战(二)—— 支持WideVine
### 一. WideVine简介 在收购Widevine之前,Android没有系统的数字版权保护机制,2010年12月,Google不惜重金将视频数字版权管理软件公司Widevine招安,弥补了Android在这方面的短板。Android从3.0开始就支持Widevine。现在Widevine已经成为GMS(Google Mobile Service)中必备的内容,所有想要得到GMS的手机厂商
2899 1
|
安全 网络安全 数据安全/隐私保护
|
C# C++
使用VSCode如何调试C#控制台程序_1
原文:使用VSCode如何调试C#控制台程序_1 A-环境安装 https://www.microsoft.com/net/download   下载 .NET Core SDK Installer: https://www.
4321 0
|
JavaScript 算法 前端开发
解密Vue 2的Diff算法:如何实现高效的DOM更新?
解密Vue 2的Diff算法:如何实现高效的DOM更新?