【发布时间】:2018-12-02 17:04:33
【问题描述】:
我有一个奇怪的验证程序,可以验证 utf-8 字符串是否是有效的主机名(PHP 中的 Zend Framework Hostname valdiator)。它允许 IDN(国际化域名)。它将每个子域与由其 HEX 字节表示定义的字符集进行比较。两个这样的集合是D800-DB7F 和DC00-DFFF。在这些比较过程中,名为 preg_match 的 PHP 正则表达式比较函数失败,并且表示此函数中不允许使用 DC00-DFFF 字符。从维基百科我了解到这些字节在 UTF-8 中被称为代理字符。 thay 是什么以及它们实际对应的字符是什么?我在几个地方读过,我仍然不明白它们是什么。
【问题讨论】:
-
在 UTF-16 中使用代理代码点来表示
FFFF之外的代码点。它们成对使用,因此一个字符由 4 个字节组成。 UTF-8 不需要这种机制,因此用 UTF-8 编码的文本不应包含它们。但是,可以使用 UTF-8 对代理代码点进行编码,因此验证例程识别它们是有意义的。 -
@lenz 我可以说
DC00-DFFF中的字符不是有效的UTF-8 字符吗?是这样吗?它们可以出现在域名中吗? -
Err... 我知道他们不应该在那里,但我不能告诉你违反了哪个标准,如果他们违反了有多严重。域名我也不知道,抱歉。
标签: utf-8 utf surrogate-pairs