使用mb_substr()获取字符串的其余部分并仍然设置编码

时间:2012-12-20 20:54:48

标签: php optional-parameters multibyte

使用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()

    省略charset参数

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

没有真正的解决方案吗?

2 个答案:

答案 0 :(得分:2)

更改日志将此显示为版本5.4.8(2012年10月18日)中的错误修复。

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

  

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

以下是拉取请求线程的链接:https://github.com/php/php-src/pull/133

答案 1 :(得分:2)

这是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;
}

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