1

谁能解释strlenPHP 的 intl 扩展中 Unicode 函数的这种奇怪行为?

var_dump(grapheme_strlen("a\r\n")); // (ASCII 'a') length: 3
var_dump(grapheme_strlen("の\r\n")); // length: 2
var_dump(grapheme_strlen("\r\n")); // length: 2

似乎grapheme_strlen将“\r\n”(CR LF,它们是用于 Windows 上的行分隔的两个单独的代码点)计算为单个字素,考虑到函数的名称,这可能是相当合理的,但它只有在行结尾前面有一个非 ASCII 字符。为什么?

4

1 回答 1

3

这是一个错误。grapheme_strlen应该在Unicode Standard Annex #29 (Unicode Text Segmentation)中定义的 Grapheme Cluster Boundaries 上工作。标准明确规定不要在 CR 和 LF 之间中断。

如果您查看 PHP 源代码,grapheme_strlen只需返回ASCII 字符串的字符数。

于 2013-09-19T15:34:29.113 回答