代理项 Surrogate
概述
代理项(Surrogate),是一种仅在 UTF-16 中用来表示补充字符的方法。在 UTF-16 中,为补充字符分配两个 16 位的 Unicode 代码单元:
- 第一个代码单元,被称为高代理项代码单元或前导代码单元;
- 第二个代码单元,被称为低代理项代码单元或尾随代码单元。
这两个代码单元组合在一起,就被称为代理项对。
相关术语
为了能更好地理解“代理项”这一概念,就需要先了解相关的 Unicode 术语:1
-
代码点(Code Point):
- Unicode 代码空间中的任何值,即从 0 到 10FFFF~16~ 的整数范围。但并非所有代码点都分配给编码字符。
- 一个字符在任何编码字符集中的值或位置。
- 代码单元(Code Unit):最小的数位组合,可以表示用于处理或交换的编码文本的单位。在 Unicode 标准中,UTF-8 编码格式采用 8 位编码单元,UTF-16 编码格式采用 16 位编码单元,UTF-32 编码格式采用 32 位编码单元。
- BMP 字符(BMP Character):位于 BMP(Basic Multilingual Plane,多语种基本面)代码点的 Unicode 编码字符。
- BMP 代码点(BMP Code Point):在 U+0000 到 U+FFFF 范围内的 Unicode 代码点。
- 补充字符(Supplementary Character):位于补充代码点的 Unicode 编码字符。
- 补充代码点(Supplementary Code Point):在 U+10000 到 U+10FFFF 范围内的 Unicode 代码点。
- 高代理项代码点(High-Surrogate Code Point):在 U+D800 到 U+DBFF 范围内的 Unicode 代码点。
- 高代理项代码单元(High-Surrogate Code Unit):在 D800~16~ 到 DBFF~16~ 范围内的 16 位代码单元,在 UTF-16 中用作代理项对的前导代码单元(Leading Code Unit)。
- 低代理项代码点(Low-Surrogate Code Point):在 U+DC00 到 U+DFFF 范围内的 Unicode 代码点。
- 低代理项代码单元(Low-Surrogate Code Unit):在 DC00~16~ 到 DFFF~16~ 范围内的 16 位代码单元,在 UTF-16 中用作代理项对的尾随代码单元(Trailing Code Unit)。
- 代理项对(Surrogate Pair):由两个 16 位代码单元组成,其中第一个是高代理项代码单元,第二个是低代理项代码单元。
-
代理项字符(Surrogate Character):用词不当。这表示一个编码字符只有一个代理项代码点,这是不可能的。所以请勿使用这个词。
特别说明:2
- 高代理项代码点和低代理项代码点,仅指定用于此用途(即字面意义所指的用途,不作他用)。
- 高代理项代码单元和低代理项代码单元,仅在 UTF-16 中使用。
- 代理项对,仅在 UTF-16 中使用。
释义
关于代理项的概念,通俗来讲,就是为补充字符找两个“代理人”。由于补充字符体格壮硕,到了 UTF-16 这个地方就需要占用两个 16 位的座位。为了避免因“占座纠纷”导致意外发生,就需要为补充字符找来两个“代理人”,代替他来占用两个座位,这样就能皆大欢喜了。
- 两个“代理人”,就是高代理项和低代理项。
- 两个“代理人”占用的座位,就是 16 位的高代理项代码单元和低代理项代码单元。
- 两个“代理人”所在的位置,就是高代理项代码点和低代理项代码点。
- 两个“代理人”组合在一起,就是代理项对。
- “代理人”一定是出双入对的。单身的“代理人”是不能表示补充字符的,只能被称为未配对代理项(Unpaired Surrogate)。
代理项仅在 UTF-16 中用来表示补充字符,是指:
- 不在 UTF-8 中使用。补充字符到了 UTF-8 这个地方就需要占用四个 8 位的座位,而实际给补充字符找的是两个 16 位的“代理人”,对不上号。
- 不在 UTF-32 中使用。在 UTF-32 这个地方提供的座位,完全符合补充字符的体形,无需再为其另找“代理人”占座。
- 不表示 BMP 字符。在补充字符没有出现时,并没有“代理人”这一概念,也就是说“代理人”并不是给 BMP 字符找的。
在 Java 中的应用
char 数据类型以及 Character 对象封装的值,都是基于最初的 Unicode 规范,该规范将字符定义为固定宽度的 16 位实体。随着 Unicode 标准的不断更新,超过 16 位的字符已被允许表示。合法代码点的范围已扩展到 U+10FFFF。
在 char 数组、String 类和 StringBuffer 类中,都采用 UTF-16 来表示字符。在这种表示法中,补充字符被表示为一对 char 值,第一个来自高代理项区间(uD800 - uDBFF),第二个来自低代理项区间(uDC00 - uDFFF)。
因此,char 值可表示 BMP 代码点、代理项代码点或 UTF-16 编码的代码单元。而所有的 Unicode 代码点,包括补充代码点,则用 int 值来表示。int 值中的低 21 位用来表示 Unicode 代码点,而高 11 位必须为零。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
详解 Flink DataStream中min(),minBy(),max(),max()之间的区别
解释 官方文档中: The difference between min and minBy is that min returns the minimum value, whereas minBy returns the element that has the minimum value in this field (same for max and maxBy). 翻译: min和minBy之间的区别是min返回最小值,而minBy返回在此字段中具有最小值的元素(与max和maxBy相同)。 但是事实上,min与max 也会返回整个元素。 不同的是min会根据指定的字段取最小值,并且把这个值保存在对应的位置上,对于其他的字段取了最先获取的值,不能保证每个元素的数值正确,max同理。 而minBy会返回指定字段取最小值的元素,并且会覆盖指定字段小于当前已找到的最小值元素。maxBy同理。 示例论证 先拿min()与minBy()举例: 取第三个元素的最小值 public static void main(String[] args) throws Exception { Strea...
- 下一篇
LeetCode 905. 按奇偶排序数组
题目 给定一个非负整数数组 A,返回一个数组,在该数组中,A 的所有偶数元素之后跟着所有奇数元素。 你可以返回满足此条件的任何数组作为答案。 示例: 输入:[3,1,2,4] 输出:[2,4,3,1] 输出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3] 也会被接受。 提示: 1 <= A.length <= 50000 <= A[i] <= 5000 解题思路 class Solution: def sortArrayByParity(self, A: [int]) -> [int]: # #双指针 # left = 0 # right = len(A)-1 # while left != right: # if A[left] %2 == 0: # left += 1 # continue # if A[right] %2 == 1: # right -= 1 # continue # A[left], A[right] = A[right], A[left] # left += 1 # if left == right:break #...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长