这不起作用,它变成乱码:

$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'));



נ


问题仅在于字母“ נ”。它可以与所有其他希伯来字母一起使用。有解决方案吗?

最佳答案

使用UTF-8数据时,请始终在模式中使用u modifier

/\s/u


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

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


\s字符是HT(9),LF(10),FF(12),CR(13)和空格(32)。


添加UTF-8支持后,他们还添加了一个称为PCRE_UCP的特殊选项,以使\b\d\s\w不仅与US-ASCII字符匹配,而且还与其他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)。 bug #52971 PCRE-Meta-Characters not working with utf-8可能与此有关。

关于php - 为什么在拆分“\s”时,PHP的preg_split会在UTF-8中拆分希伯来字母“נ”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4231864/

10-16 18:53