2

这不起作用,它变成了胡言乱语:

$foo = 'נ';
$bar = mb_convert_encoding($foo, 'UTF-8', mb_detect_encoding($foo));
print_r(preg_split('/\s/', $bar));

数组 ( [0] => � [1] => )

但这有效:

$foo = 'נ';
$bar = mb_convert_encoding($foo, 'ISO-8859-8', mb_detect_encoding($foo));
$baz = preg_split('/\s/', $bar);
echo(mb_convert_encoding($baz[0], 'UTF-8', 'ISO-8859-8'));

נ

问题仅在于字母“ נ”。它适用于所有其他希伯来字母。有解决方案吗?

4

1 回答 1

7

处理 UTF-8 数据时,请始终在模式中使用u修饰符

/\s/u

因为否则该模式不会被解释为 UTF-8。

就像在这种情况下,字符נ(U+05E0) 在 UTF-8 中用 0xD7A0 编码。并\s表示任何空白字符(根据PCRE):

字符为 HT ( \s9)、LF (10)、FF (12)、CR (13) 和空格 (32)。

添加 UTF-8 支持后,他们还添加了一个名为 PCRE_UCP 的特殊选项,以具有\b, \d, \s,\w不仅匹配 US-ASCII 字符,还通过其 Unicode 属性匹配其他 Unicode 字符:

默认情况下,在 UTF-8 模式下,值大于 128 的字符永远不会匹配 \d\s\w,而始终匹配\D\S\W。[…] 但是,如果 PCRE 编译时使用 Unicode 属性支持,并且设置了 PCRE_UCP 选项,则行为会发生更改,以便使用 Unicode 属性来确定字符类型,如下所示:

  • \d 任何\p{Nd}匹配的字符(十进制数字)
  • \s 任何\p{Z}匹配的字符,加上 HT、LF、FF、CR
  • \w 任何匹配的字符\p{L}\p{N}加上下划线

并且该不间断空格 U+00A0 具有分隔符 ( \p{Z}) 的属性。

因此,尽管您的模式不是 UTF-8 模式,但它似乎\s UTF-8 代码字 0xD7A0 中的 0xA0 匹配,在该位置拆分字符串并返回一个等效于array("\xD7", "").

这显然是一个错误,因为该模式不是UTF-8 模式,但 0xA0大于0x80(此外,0xA0 将被编码为 0xC2A0)。错误 #52971 PCRE -Meta-Characters not working with utf-8可能与此有关。

于 2010-11-20T08:33:25.580 回答