Php 为什么省略号会打断substr_替换?

Php 为什么省略号会打断substr_替换?,php,character-encoding,Php,Character Encoding,如果我像这样使用substr\u replace() echo substr_replace('Replace: foo', 'bar', 9, 3); // Echoes 'Replace:bar' 。。。它工作得很好,但是如果只更改冒号作为省略号(不更改起始位置),我会得到 但是,如果我更改开始位置,它会工作: echo substr_replace('Replace… foo', 'bar', 11, 3); // Echoes 'Replace… bar' < > >代码>子字符串

如果我像这样使用
substr\u replace()

echo substr_replace('Replace: foo', 'bar', 9, 3);
// Echoes 'Replace:bar'
。。。它工作得很好,但是如果只更改冒号作为省略号(不更改起始位置),我会得到

但是,如果我更改开始位置,它会工作:

 echo substr_replace('Replace… foo', 'bar', 11, 3);
// Echoes 'Replace… bar'

< > >代码>子字符串替换()/代码>考虑省略为偏移目的的三个单独字符吗?这是一个编码问题吗?

经过长时间的拉扯,我找到了答案:
substr\u replace
与多字节(utf-8)不兼容。

由于没有
mb\u substr\u replace()
这里有一个与上述示例等效的解决方法:

mb_internal_encoding("UTF-8");
$text = 'Replace… foo';
$start = 9;
$length = 3;
echo mb_substr($text, 0, $start) . $foo . mb_substr($text, $start, $start+$length);
有关解决方案的更多详细信息,请参阅

mb_internal_encoding("UTF-8");
$text = 'Replace… foo';
$start = 9;
$length = 3;
echo mb_substr($text, 0, $start) . $foo . mb_substr($text, $start, $start+$length);