UTF-16编码原理讲解

news2025/6/23 16:57:07

文章目录

  • 一、unicode
  • 二、什么是UTF-16
  • 三、编码规则
    • 一个码元
    • 两个码元
  • 四、问题
    • 大端序小端序?
  • 参考


一、unicode

unicode是一个字符集,也称为unicode编码,为每一个字符分配了一个ID,这个ID称为码点

Unicode的编码空间从U+0000到U+10FFFF,共有1,112,064个码位(code point)可用来映射字符。Unicode的编码空间可以划分为17个平面(plane),每个平面包含216(65,536)个码位。17个平面的码位可表示为从U+xx0000到U+xxFFFF,共计17个平面。第一个平面称为基本多语言平面(Basic Multilingual Plane, BMP),或称第零平面(Plane 0),其他平面称为辅助平面(Supplementary Planes)。基本多语言平面内,从U+D800到U+DFFF之间的码位区段是永久保留不映射到Unicode字符。UTF-16就利用保留下来的0xD800-0xDFFF区段的码位来对辅助平面的字符的码位进行编码
在这里插入图片描述


二、什么是UTF-16

UTF-16(16 bit Unicode Transformation Format)即16位的Unicode转换格式,以16位即双字节为编码单元
UTF-16的编码对象就是unicode


三、编码规则

一个码元

我们常用到的字符都在unicode的第一个平面,也就是基本多语言平面(Basic Multilingual Plane, BMP),范围是0x0000-0xFFFF

UTF-16以两个字节为一个编码单位,范围是 0x0000 - 0xFFFF。我们称为码元
当我们使用的字符unicode码点在 0x0000 - 0xFFFF的时候
utf-16的编码和unicode的编码是一一对应的
比如 “”的码点是 6211, 在多语言平面内,所以UTF-16编码也是 6211

两个码元

码点范围 0x10000 - 0x10FFFF的字符已经无法使用1个编码单位来标识,所以此时需要两个码元
比如😂这个字符的码点为 U+1F602

将码点范围左移 0x10000,此时码点范围是 0x0 - 0xFFFFF, 为什么要移这一下子呢,因为0x10FFFF有21位,左移完只有20位,更好做拆分
将😂的码点同样进行左移

0x1F602 - 0x10000 = 0xf602

展开为20位,并分为两组,10位一组

0000111101 1000000010

将这组数据放入两个码元中(一个编码单位为两字节(16位)),其余补0

xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx	# 两个码元
xxxxxx0000111101 xxxxxx1000000010		# 填充
0000000000111101 0000001000000010		# 补0
0x3D 0x202

得到第一个码元或称作高位代理(high surrogate)
得到第二个码元或称作低位代理(low surrogate)
现在一个码元的范围是 0 - 0x3FF(10位bit最高可表示0x3FF)

在多语言平面中,从U+D800到U+DFFF之间的码位区段是永久保留不映射到Unicode字符,其大小为

0xDFFF - 0xD800 = 0x7FF

而一个码元的范围在 0x3FF, 所以将该码元移动到该区域

高位代理移动

0x3D + 0xD800 = 0xD83D

地位代理移动
高位代理占用了0x3FF的空间,所以地位代理要从 0xD800 + 0x3FF + 1 的地方开始移动

0xDC00 + 0x202 = 0xDE02

所以😂的最终编码就是 0xD8 0x3D 0xDE 0x02


四、问题

大端序小端序?

这里以notepad++编辑器举例(其他编辑器也有可能有这个问题)
在这里插入图片描述
这里的Big Endian为大端序,另一个就是小端序了,如果你想看到正确的显示效果那么就选择大端序
,使用二进制编辑器打开时会发现文件开头有 FE FF,这是BOM,忽略即可,从后面开始看
详细可以参考: https://blog.csdn.net/qq_56313338/article/details/133788268

参考

  • bilibili

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1086239.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Win11磁盘分区后在恢复之前分区的方法介绍

电脑磁盘分区对于新购买的电脑来说,是整理电脑第一步要做的事情,大家一般都会根据自己的需要把磁盘划分为C盘、D盘、E盘等等方面文件的管理,今天小编给大家介绍一下Win11操作系统下,如何进行分区,如何恢复之前的分区&a…

容器部署的openstack进入数据库流程、查看install目录流程、容器部署使用virsh命令流程【查看计算节点上的虚拟机信息】

说明 何为容器部署,无需多说吧? 如下 计算节点的容器 进入数据库方法【控制节点】 获取nova密码 首先获取nova数据库的密码 控制节点执行:grep mysql /etc/kolla/nova-api/nova.conf 【目录不是固定的,可以通过find命令查找n…

Apache Ant的安装

介绍 Apache Ant是一个Java库和一个 命令行工具,可以用来构建Java应用。Ant提供了许多内置的任务(tasks),可以编译、组装、测试、运行Java应用。Ant也可以构建非Java应用,例如C、C应用。 Ant非常灵活,没有…

VBA入门2——程序结构

VBA基础入门2 VBA 程序结构VBA 程序结构入门(认识 VBA 程序骨架)循环结构判断结构 VBA 变量的声明和赋值(使程序动起来)不同变量类型声明语句如何声明多个变量声明变量是必须的嘛?变量赋值 VBA 程序顺序结构&#xff0…

python实现图像的直方图均衡化

直方图均衡化是一种用于增强图像对比度的图像处理技术。它通过重新分配图像中的像素值,使得图像的像素值分布更加均匀,增强图像的对比度,从而改善图像的视觉效果。 直方图均衡化的过程如下: 灰度转换:如果图像是彩色…

Vue3路由引入报错解决:无法找到模块“xxx.vue”的声明文件 xxx隐式拥有 “any“ 类型。

这类情况应该遇见过吧,这是因为 TypeScript只能理解 .ts 文件,无法理解 .vue 文件。 解决方法:在项目的根目录或者src文件夹下创建一个后辍为 文件名.d.ts 的文件,并写入一下内容: declare module *.vue {import { …

c++视觉处理---计算轮廓面积

矩的计算:cv::moments cv::moments 是OpenCV中用于计算图像或轮廓的矩特征的函数。矩特征是一种用于描述图像或轮廓的几何特性的方法,包括中心矩、归一化中心矩、中心矩矩和归一化中心矩矩等。这些特征在形状分析、对象识别和物体测量等领域非常有用。 …

携多项创新成果燃爆全场,移远通信亮相中国移动全球合作伙伴大会

10月11日, 2023中国移动全球合作伙伴大会盛大开幕,本次大会为期三天,以“算启新程 智享未来”为主题,为业界带来一场极具科技性、创新性、前瞻性的数智盛宴。 作为中国移动的重要合作伙伴,移远通信携5G、RedCap、卫星通…

数据结构:二叉排序树

什么是二叉排序树? 二叉排序树要么是空二叉树,要么具有如下特点: 二叉排序树中,如果其根结点有左子树,那么左子树上所有结点的值都小于根结点的值;二叉排序树中,如果其根结点有右子树&#xf…

Nlopt在matlab中的配置教程

step1:克隆代码并编译 编译的前提是已经安装好MinGW64 # 使用镜像加速 git clone https://gitclone.com/github.com/stevengj/nloptcd nlopt mkdir build cd build cmake -G"MinGW Makefiles" .. cmake --build .# 注意此处博主在mingw安装目录将mingw3…

golang 獲取 prometheus數據

使用github上的一個庫 1.安裝庫 go get github.com/prometheus/client_golang 2.導入 在import中導入,記得要在go.mod中更新一下 ------------------------------------------------------------------------------------ Address: "http://xx.xx.xx:9090…

ROS IMU 数据发布---rviz_imu_plugin的安装

ROS中发布IMU传感器消息 - 润新知 按照上述链接的方法执行 catkin_make install -DCMAKE_INSTALL_PREFIX/opt/ros/noetic 后报错 这个错误是因为在安装过程中,CMake无法将文件复制到目标路径。这可能是由于权限不足导致的。可以尝试使用以下命令更改目标文件夹的…

Mac删除不在程序坞的程序

现象描述:删除某个程序时(通过‘程序’列表中将该应用移动到废纸篓里),该应用程序正在运行中,删除过程该程序未提示正在运行中,仅仅删除了图标(在此吐槽下该程序的交互,产品没有考虑…

sql文件数据量太大,不打开sql文件,使用sqlplus往oracle数据库中写入大量数据

1、sqlplus 用户名/密码XE 2、往数据库中写入语句的sql文件路径 3、commit; (分号要写)如果不提交的话,数据库中新写入的数据不显示。

Allegro在测量时如何同时显示双单位

Allegro在测量时,默认只显示单个单位,根据PCB文件设计时所设定的单位决定,显示mil或mm。对于习惯看某个参数的设计者来说不方便。那如何同时显示mil和mm双单位呢? 点击Setup菜单 选择User Preferences...(用户参数设置) 跳出下面的对话框,选择Display→Element(元素)→…

【error】root - Exception during pool initialization

报错提示:root - Exception during pool initialization. 错误原因: 配置数据库出错 我的错误配置: spring.datasource.urljdbc:mysql://localhost:3306/springboot?serverTimezoneGMT spring.datasource.nameroot spring.datasource.pass…

Java实现基数排序

今天迷茫一天,没时间补博客,我就分享一个我认为最好的排序,思想也很容易解决很多关于字符串和数组问题,举个例子吧,求相邻元素的差值。 1.前言 基数排序是一种非比较排序算法,它将待排序的数字按照其每一位…

stm32学习笔记:EXIT中断

1、中断系统 中断系统是管理和执行中断的逻辑结构,外部中断是众多能产生中断的外设之一。 1.中断: 在主程序运行过程中,出现了特定的中断触发条件 (中断源,如对于外部中断来说可以是引脚发生了电平跳变,对于定时器来…

el-table组件的封装

前言:仔细看懂本篇博客,玩转element table 不成问题 ,个人理解所谓封装,就是把经常都要公用的东西,拿出来,可以多次复用。公用方法,公用页面都可以封装。 其实封装也并不是有多难,思…

Linux和UNIX的关系及区别

UNIX 与 Linux 之间的关系是一个很有意思的话题。在目前主流的服务器端操作系统中,UNIX 诞生于 20 世纪 60 年代末,Windows 诞生于 20 世纪 80 年代中期,Linux 诞生于 20 世纪 90 年代初,可以说 UNIX 是操作系统中的"老大哥&…