首页 > 其他分享 >关于UTF-16

关于UTF-16

时间:2023-04-13 11:04:25浏览次数:39  
标签:字符 码元 0000 0011 16 关于 UTF

前言

首先要明确的一点是:UTF-16 是将 Unicode 中的字符编码转换为实际存储形态的实现方式。因此,在了解 UTF-16 之前,先要简单认识一下什么是 Unicode。

Unicode

Unicode 是计算机科学领域中的一项业界标准,包括字符集和编码方案等,目的是为了解决传统字符编码方案的局限性,以满足跨语言、跨平台进行文本转换、处理的要求。

Unicode 的编码范围为 0~0x10FFFF,其中 U+0000~U+FFFF 为基本平面(BMP),常见的字符都映射在此平面;U+010000~U+10FFFF 为辅助平面(SMP),剩下的字符都映射在此平面。

下面还有两个概念会贯穿下文:

  • 码点:一个字符在 Unicode 编码表中对应的一个编码值即为一个码点,一个码点由一个或多个码元组成
  • 码元:即具体编码形式中的最小单位,如 UTF-8 中一个码元为 8 位,UTF-16 中一个码元为 16 位

UTF-16

Unicode 字符集用 0~0x10FFFF 映射字符,而 UTF-16 就是将映射的编码转换为实际存储形态的一种实现方式。UTF 是 Unicode Transfer Format 的缩写,即将 Unicode 转换为某种格式之意。UTF-16 的应用范围十分广泛,Java 和 JavaScript 内部的默认编码方式皆为 UTF-16。

UTF-16 是一种变长编码方式,每个字符编码由 1~2 个码元构成,码元长度为 16 位。其中基本平面的字符为 1 个码元,辅助平面的字符为 2 个码元,也可以说 UTF-16 的编码长度为 2 Byte 或 4 Byte。因此如何判断一个字符是由下一个码元表示还是由下两个码元表示就是下面要关注的一个重要的问题。

编码方式:

在基本平面中有一段空白区间 U+D800~U+DFFF 没有字符的映射关系,这是用来辅助平面字符的,这段区间称为代理区。简单来说,出现了代理区中的码元就意味着字符由下两个码元共同表示,其中前一个码元为高位(H),后一个码元为低位(L)。

设:码点为 U

则:H = ( U - 0x10000 ) / 0x400 + 0xD800,L = ( U - 0x10000 ) % 0x400 + 0xDC00

下面展开介绍算法究竟做了什么

设:码点为 U+1D306
∵ U+1D306 > U+FFFF
∴ 需要由两个码元表示

U+1D306 的二进制表示为:
0001  1101  0011  0000  0110

计算高低位都先减去 0x10000,用二进制表示为:
0001  1101  0011  0000  0110
-
0001  0000  0000  0000  0000
=
0000  1101  0011  0000  0110
即:U+D306

接着,
高位除以 0x400,用二进制表示为:
0000  1101  0011  0000  0110
/
0000  0000  0100  0000  0000
=
0000  0000  0000  0011  0100

再加 0xD800,用二进制表示为:
0000  0000  0000  0011  0100
+
0000  1101  1000  0011  0100
即:U+D834

低位对 0x400 除余,用二进制表示为:
0000  1101  0011  0000  0110
%
0000  0000  0100  0000  0000
=
0000  0000  0011  0000  0110

再加 0xDC00,用二进制表示为:
0000  0000  0011  0000  0110
+
0000  1101  1100  0000  0000
=
0000  1101  1111  0000  0110
即:U+DF06

∴ U+1D306 在内存中的编码为 0xD834 0xDF06,代码中表示为 \uD834\uDF06

我们回过头来对算式过程进行纵向对比不难发现,高低位计算的三个步骤为:

  1. 去溢出位
  2. 平分前后 10 位
  3. 加高低位鉴别

由算式过程反推也可以得出结论:码元高 6 位为 54 的为高位,码元高 6 位为 55 的为低位。

拓展:

  • Java 中的 char 类型描述了 UTF-16 编码中的一个码元
  • JavaScript 中 String.prototype.length 描述的是字符串编码后的码元个数

标签:字符,码元,0000,0011,16,关于,UTF
From: https://www.cnblogs.com/nongyi/p/17312665.html

相关文章

  • P8816 [CSP-J 2022] 上升点列
    P8816[CSP-J2022]上升点列欧几里得距离\(h=\sqrt{(x_2-x_1)^2+(y_2-y_1)^2}\) 。横坐标、纵坐标值均单调不减,A点可向上和向右。①不连接,用上所有点,序列长度为\(j+1\)。②从A点向前枚举(1)判断点是否合法(2)所用点\(j\leK\).01背包与最长子序列结合:\(f[i][j]\)表示......
  • 最高法、河南高院--对主体质量问题的返修责任不属于从给付义务,可以适用法律关于履行抗
    (2020)最高法民终928号  吉林省筑居房地产开发有限公司、中建二局第一建筑工程有限公司建设工程施工合同纠纷二审民事裁定书本院认为:建设工程的质量就是生命。吉林省宏盛工程检测有限公司对案涉工程二期地下车库进行质量检测所出具的SFJD字2018第0032号《司法鉴定意见书》已经明......
  • ubuntu 22.04国内镜像阿里云/163源/清华大学/中科大
    Ubuntu22.04LTS这是一个长期支持版本,它将被支持五年,直到2027年4月。已发布的LTS版本带来了一些新的功能国内有很多Ubuntu22.04的镜像源,包括阿里、网易,还有很多教育网的镜像源,比如清华源、中科大源。在教程中我们将介绍如何更改镜像在ubuntu22.04。国内的包括有镜像阿里云/16......
  • 关于浏览器sessionStorage共享问题
    今天也是闲暇之余看了点前端基础知识发现了好玩的window.open("同源页面")这种方式新开的页面会复制之前的sessionStorage通过a标签新开的页面同样也会,原理相同,在这就不赘述了。SessionStorage也有同源策略的限制,但是SessionStorage有一条更加严格的限制SessionStorage只有在......
  • 关于百鸡百钱问题的C语言解决
    百鸡百钱问题 1.问题描述公鸡5钱一只,母鸡3钱一只,小鸡1钱三只,用一百个钱买一百只鸡,公鸡,母鸡,小鸡各多少只2.设计思路不妨先设公鸡数量为x母鸡数量为y小鸡数量为z则可列出方程:x+y+z=1005x+3y+1/3z=100又因为只有100钱所以x<20y<333.程序流程 4.代码#include<stdio.h>......
  • MBI5253GFN-A专为LED视频应用而设计的16通道PWM恒流LED驱动器芯片
    MBI5253GFN-A是为使用内部脉宽调制(PWM)控制的LED视频应用而设计的,具有可选择的14位/13位色深。MBI5253具有一个16位移位寄存器,它将串行输入数据转换为输出端口的每个像素灰度。16个调节电流端口设计用于提供均匀和恒定的电流接收器,以驱动具有广泛VF变化范围的LED。输出电流可以通过......
  • 关于小程序SDK,或许你想知道这些
    大家在做移动端应用开发的时候都会不满足于APP客户端,小程序的应用也越来越广泛了。小程序SDK应运而生,意在帮助用户提高运维效率、小程序作为一种轻量级的应用形态,越来越受到开发者和用户的欢迎。什么是小程序SDK?小程序SDK是一种开发工具包,用于开发和构建小程序应用程序。它提供了一......
  • 230412 关于阅读的材料选择与阅读方法
    你最近在总结你的学习系统的时候,遇到了一个问题.就是Morty建议,通过阅读,尤其是广泛的阅读提升英语的理解力.关于如何通过阅读提升理解力,你在2月的时候,应该有过思考.主要的参考资料就是230211中,如何通过阅读提升英语.粟之的建议是通过精读,去弄懂文章的中心意思.但是,你......
  • python关于*args所能接收的参数、关于**kwargs所接收的参数详解
    1#!/usr/bin/envpython2#-*-coding:utf8-*-3#python-day32-20170110:456#关于*args所能接收的参数78#这种接收的是位置参数,可变长9deffunc1(*args):10print(args,type(args))1112#传入位置参数可以被args所接收,以元组的形式来保存......
  • iOS16新特性 | 灵动岛适配开发与到家业务场景结合的探索实践
    作者:京东零售姜海灵动岛是苹果在iPhone14Pro和iPhone14ProMax上首次提出的全新UI交互形式,创新性的让虚拟软件和硬件的交互变得更为流畅。当有来电、短信等通知时,灵动岛会变化形态,以便让用户能够更直观地接收到这些信息。而在用户使用一些应用App,比如音乐,并将其切换到后台......