UTF-8 中的代理字符是什么?

What are surrogate characters in UTF-8?

我有一个奇怪的验证程序,用于验证 utf-8 字符串是否为有效主机名(PHP 中的 Zend Framework 主机名验证器)。它允许 IDN(国际化域名)。它将每个子域与由其十六进制字节表示定义的字符集进行比较。两个这样的集合是 D800-DB7FDC00-DFFF。 Php 正则表达式比较函数 preg_match 在这些比较过程中失败,它表示此函数中不允许使用 DC00-DFFF 个字符。从维基百科我了解到这些字节在 UTF-8 中被称为代理字符。 thay 是什么,它们实际上对应于哪些字符?看了好几处还是不明白是什么

What are surrogate characters in UTF-8?

这几乎就像一个技巧问题。

近似答案 #1:4 个字节(如果配对并以 UTF-8 编码)。

近似答案 #2:无效(如果未配对)。

近似答案 #3:它不是 UTF-8;它是 修改后的 UTF-8

概要:该术语不适用于 UTF-8。

Unicode 代码点的范围需要 21 位数据。

UTF-16 编码单元是 16 位。 UTF-16 将一些 Unicode 代码点范围编码为一个代码单元,将其他代码点编码为成对的两个代码单元,第一个来自 "high" 范围,第二个来自 "low" 范围。 Unicode 将匹配高低对范围的代码点保留为无效。他们有时被称为代理人,但他们不是角色。它们本身没有任何意义。

UTF-8编码单元是8位。 UTF-8 将几个不同范围的代码点分别编码为一到四个代码单元。

#1 恰好UTF-16编码为2个16位编码单元,UTF-8编码为4个8位编码单元,反之亦然。

#2 可以对无效码点应用UTF-8编码算法,无效。它们无法解码为有效的代码点。合规的 reader 会抛出异常或抛出字节并插入替换字符 (�)。

#3 Java 提供了一种使用称为 JNI 的系统在外部代码中实现功能的方法。 Java String API 提供对作为 UTF-16 代码单元的 String 和 char 的访问。在 JNI 的某些地方,大概是为了方便起见,字符串值是 修改后的 UTF-8。修改后的 UTF-8 是应用于 UTF-16 代码单元而不是 Unicode 代码点的 UTF-8 编码算法。

无论如何,字符编码的基本规则是使用用于写入的编码读取。如果要将任何字节序列视为文本,则必须知道编码;否则,您将丢失数据。