gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:24:52 27 4
gpt4 key购买 nike

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

最佳答案

What are surrogate characters in 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编码算法。

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

关于utf-8 - UTF-8中的代理字符是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51001150/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com