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

时间:2018-06-23 12:27:54

标签: utf-8 utf surrogate-pairs

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

1 个答案:

答案 0 :(得分:1)

  

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

这几乎像一个技巧问题。

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

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

大概答案3:它不是UTF-8;它不是UTF-8。它是修改后的UTF-8

简介:该术语不适用于UTF-8。

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

UTF-16代码单元为16位。 UTF-16将Unicode代码点的某些范围编码为一个代码单元,而另一些编码为成对的两个代码单元,第一个来自“高”范围,第二个来自“低”范围。 Unicode将与高和低对的范围匹配的代码点保留为无效。它们有时称为代理人,但不是字符。他们自己没有任何意义。

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

#1碰巧,UTF-16用两个16位代码单元编码,UTF-8用4个8位代码单元编码,反之亦然。

#2可以将UTF-8编码算法应用于无效的代码点,该代码点无效。无法将它们解码为有效的代码点。符合要求的阅读器会抛出异常或抛出字节,然后插入替换字符(。)。

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

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