这不起作用,它变成乱码:
$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/