使用mb_substr()将字符串的其余部分放到末尾,然后仍然设置编码


Get rest of the string to the end with mb_substr() and still set encoding

使用substr(),您可以省略第三个参数来获得字符串的其余部分:

substr('abcdefg', 2) // returns "cdefg"

你不能用mb_substr():做同样的事情

mb_substr('abcdefg', 2, null, 'UTF-8'); // returns empty string

我只找到了奇怪而丑陋的解决方案。

  • 设置一个非常高的数字作为长度:

    $a = mb_substr('abcdefg', 2, 9999999999, 'UTF-8');

  • 计算数字:

    $a = mb_substr('abcdefg', 2, mb_strlen('abcdefg', 'UTF-8') - 2, 'UTF-8');

  • 使用mb_internal_encoding():省略字符集参数

    $temp = mb_internal_encoding(); // prevent action at a distance
    mb_internal_encoding('UTF-8');
    $a = mb_substr('abcdefg', 2);
    mb_internal_encoding($temp);

难道没有真正的解决方案吗?

更改日志显示这是5.4.8版(2012年10月18日(中的一个错误修复。

http://us.php.net/ChangeLog-5.php

允许将null作为默认值传递给mb_substr((和mb_strcut((。Alexander Moskaliov通过GitHub PR#133发布的补丁。

这里还有一个到pull请求线程的链接:https://github.com/php/php-src/pull/133

这是PHP 5.3(可能在早期版本中也是如此(和PHP 5.4之间的区别。

事实上,如果你好奇的话,你可以在PHP的源代码中看到这个问题。

文件ext/mbstring/mbstring.cPHP_FUNCTION(mb_substr)函数中具有以下差异。

PHP 5.3中,他们检查这种情况:

if (argc < 3) {
    len = str_len;
}

而在PHP 5.4中,他们使用:

if (argc < 3 || Z_TYPE_PP(z_len) == IS_NULL) {
    len = str_len;
}

您可以在上述文件中PHP_FUNCTION(mb_substr)启动的mb_string函数的实现中找到这些定义。源代码可以从php.net下载页面下载。