【发布时间】:2013-09-02 13:52:59
【问题描述】:
来自the manual:
\x之后,最多读取两个十六进制数字(字母可以在 大写或小写)。在 UTF-8 模式下,\x{...}是允许的,其中 大括号的内容是一串十六进制数字。它是 解释为 UTF-8 字符,其代码编号是给定的 十六进制数。 原始的十六进制转义序列,\xhh, 如果值大于 127,则匹配一个两字节的 UTF-8 字符。
那么这是什么意思呢?
“ä”的代码点是 E4,而 UTF-8 表示是 C3A4,但两者都不匹配:
$t = 'ä'; // same as "\xC3\xA4";
preg_match('/\\xC3A4/u', $t); // doesn't match
preg_match('/\\x00E4/u', $t); // doesn't match
当我给出代码点时,它确实匹配了花括号:
preg_match('/\\x{00E4}/u', $t); // matches
【问题讨论】:
-
除非我遗漏了什么,否则该手册页急需重新措辞:UTF-8 是一种编码为 Unicode 字符(代码点)字节的编码,但它提到“一个 UTF-8 字符,其代码是...”和“一个两字节的 UTF-8 字符”,这两者都没有任何意义。它要么识别 Unicode 代码点,要么识别 UTF-8 字节序列;我完全不确定是哪个。