在使用循环中的grapheme_extract来转义字符串以进行调试输出的函数中调试一个没完没了的循环时,我注意到对于字符串"\r\n",没有返回代码点$cp,也没有更新$next指针。
这是一个错误还是某个有文档记录的特性(没有找到任何关于它的东西)?
是否有其他字符串已知被grapheme_extract忽略?
最小测试用例:
$next = 0;
$cp = grapheme_extract("\r\n", 1, GRAPHEME_EXTR_MAXCHARS, 0, $next);
echo implode('_', [strlen($cp), $next]);结果:0_0,预期:1_1
PHP: 7.3.9和7.2.22,x64,Linux
grapheme_extract为所有其他测试的非空字符串(包括"\0"、"\r\r"和"\n\n")识别第一个字节。
发布于 2019-10-17 03:03:31
我四处兜圈子,得出了这样的结论:grapheme_extract确实不是为我尝试使用它而设计的。
给GRAPHEME_EXTR_MAXCHARS只为长度限制更改输出字符串的粒度。
抽取粒度始终是输入字符串中的一个字素聚类。
"\r\n"中的两个代码点本身就是有效的集群,但它们作为一个单独的提取单元被处理,因为它们出现在输入字符串中,因此由Unicode字素簇分离规则形成一个单独的集群。
修正最小测试用例:
$next = 0;
$cp = mb_substr("\r\n", $next++, 1, 'UTF-8');
echo implode('_', [strlen($cp), $next]);结果:1_1如预期
https://stackoverflow.com/questions/58394247
复制相似问题