专栏首页Java 文苑代理项 Surrogate
原创

代理项 Surrogate

概述

代理项(Surrogate),是一种仅在 UTF-16 中用来表示补充字符的方法。在 UTF-16 中,为补充字符分配两个 16 位的 Unicode 代码单元:

  • 第一个代码单元,被称为高代理项代码单元或前导代码单元;
  • 第二个代码单元,被称为低代理项代码单元或尾随代码单元。

这两个代码单元组合在一起,就被称为代理项对。

相关术语

为了能更好地理解“代理项”这一概念,就需要先了解相关的 Unicode 术语

  • 代码点(Code Point):
    1. Unicode 代码空间中的任何值,即从 0 到 10FFFFH 的整数范围。但并非所有代码点都分配给编码字符。
    2. 一个字符在任何编码字符集中的值或位置。
  • 代码单元(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):在 D800H 到 DBFFH 范围内的 16 位代码单元,在 UTF-16 中用作代理项对的前导代码单元(Leading Code Unit)。
  • 低代理项代码点(Low-Surrogate Code Point):在 U+DC00 到 U+DFFF 范围内的 Unicode 代码点。
  • 低代理项代码单元(Low-Surrogate Code Unit):在 DC00H 到 DFFFH 范围内的 16 位代码单元,在 UTF-16 中用作代理项对的尾随代码单元(Trailing Code Unit)。
  • 代理项对(Surrogate Pair):由两个 16 位代码单元组成,其中第一个是高代理项代码单元,第二个是低代理项代码单元。
  • 代理项字符(Surrogate Character):用词不当。这表示一个编码字符只有一个代理项代码点,这是不可能的。所以请勿使用这个词。

特别说明

  1. 高代理项代码点和低代理项代码点,仅指定用于此用途(即字面意义所指的用途,不作他用)。
  2. 高代理项代码单元和低代理项代码单元,仅在 UTF-16 中使用。
  3. 代理项对,仅在 UTF-16 中使用。

释义

关于代理项的概念,通俗来讲,就是为补充字符找两个“代理人”。由于补充字符体格壮硕,到了 UTF-16 这个地方就需要占用两个 16 位的座位。为了避免因“占座纠纷”导致意外发生,就需要为补充字符找来两个“代理人”,代替他来占用两个座位,这样就能皆大欢喜了。

  • 两个“代理人”,就是高代理项和低代理项。
  • 两个“代理人”占用的座位,就是 16 位的高代理项代码单元和低代理项代码单元。
  • 两个“代理人”所在的位置,就是高代理项代码点和低代理项代码点。
  • 两个“代理人”组合在一起,就是代理项对。
  • “代理人”一定是出双入对的。单身的“代理人”是不能表示补充字符的,只能被称为未配对代理项(Unpaired Surrogate)。

代理项仅在 UTF-16 中用来表示补充字符,是指:

  1. 不在 UTF-8 中使用。补充字符到了 UTF-8 这个地方就需要占用四个 8 位的座位,而实际给补充字符找的是两个 16 位的“代理人”,对不上号。
  2. 不在 UTF-32 中使用。在 UTF-32 这个地方提供的座位,完全符合补充字符的体形,无需再为其另找“代理人”占座。
  3. 不表示 BMP 字符。在补充字符没有出现时,并没有“代理人”这一概念,也就是说“代理人”并不是给 BMP 字符找的。

在 Java 中的应用

以下内容来自 Java API 文档

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 位必须为零。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java | 顶层类(Top-Level Class)

    顶层类(Top-Level Class),是 Java 中对类的一种定义方式。在 .java 文件中,处于最外层的类就称为顶层类,在其外部不存在将其包围起来的任...

    Blume
  • 持续集成利器,GitHub Actions

    GitHub Actions 是 GitHub 推出的持续集成服务,于 2018 年 10 月推出,目前已经可以投入到正式环境中使用。

    灵魂画师牧码
  • 为什么AngularJs会火?

    Angular.js is a MV* (Model – View – Whatever) Javascript framework which is main...

    javascript.shop
  • sklearn-preprocessing使用

    将数据按期属性(按列进行)减去其均值,并处以其方差。得到的结果是,对于每个属性/每列来说所有数据都聚集在0附近,方差为1。

    周小董
  • 第二届中国互联网新型版权问题研讨会成功举办

    第二届中国互联网新型版权问题研讨会成功举办 10月24日,由腾讯互联网与社会研究院发起,并与《中国版权》杂志社联合主办的“第二届中国互联网新型版权问题研讨...

    腾讯研究院
  • 为什么很多程序员开发效率低

    在软件和互联网行业从业20多年,发现很多的程序员不知道怎么提升效率,团队有团队开发协作的效率,但单兵来讲,也有个效率问题。本文就单单讲一下开发如果提升自身效率的...

    用户5829239
  • JS代码超过1000行,该怎么维护?

    1000行JS代码,听起来挺多的,但实际上真不算什么,随便一个功能完备、代码健壮的JS应用或是模块,很轻松的就写出1000多行,看这里,我以前写的一个tabel...

    web前端教室
  • 编码和Python的bytearray

    GBK UTF-8  是 字符集  编码方法   ===》 Apache  nginx

    py3study
  • 携程开源数据库访问框架

    随着企业规模扩张和业务量的急剧增加,作为系统核心的数据库相关开发也会经历一个由单一团队发展为多团队;由单机扩张到集群;由单数据库发展为多数据库;由采用单一数据库...

    逸鹏
  • PYTHON网络编程基础

    《Python网络编程基础》可以作为各层次Python、Web和网络程序的开发人员的参考书,在实际工作中使用书中的技术,效果更佳。

    用户3157710

扫码关注云+社区

领取腾讯云代金券