PHP:json_encode返回false,打印var_export(json_last_error())输出5:JSON_ERROR_UTF8

一、问题

  • json_encode 返回 false
  • 本地都没问题,但是线上就有问题
  • 猜测是PHP版本的原因

二、产生的原因

  • PHP版本原因
  • 本地是 7.0.9版本
  • 线上是 5.5.8版本

三、解决

  • 低版本PHP 对字符串的 所有 操作mb_substr()都要加上编码utf-8
public function jsonDemo()
    {
    
    
        $string = "你好,页面内容展示";

        //低版本PHP(5.4.45)截取乱码,内容为:你?
        //高版本PHP(7.0.9)无问题,内容为:你好,页
        $subString = mb_substr($string, 0, 4);

        //低版本解决:指定字符编码为utf-8
//        $subString = mb_substr($string, 0, 4, 'utf-8');

        $user = [
            'id' => 1,
            'remark' => $subString
        ];

//        $jsonString = json_encode($user, JSON_UNESCAPED_UNICODE); //报错:json_encode(): Invalid UTF-8 sequence in argument
        $jsonString = @json_encode($user, JSON_UNESCAPED_UNICODE); //忽略警告

        var_export($jsonString); //打印:'{"id":1,"remark":null}'
        var_export(json_last_error()); //打印:5

        //json_last_error值对应的msg
        <<<EOF
0 = JSON_ERROR_NONE

1 = JSON_ERROR_DEPTH

2 = JSON_ERROR_STATE_MISMATCH

3 = JSON_ERROR_CTRL_CHAR

4 = JSON_ERROR_SYNTAX

5 = JSON_ERROR_UTF8
EOF;

    }

四、mb_strpos支持编码设置(第四个参数)

1、说明

  • 查找 string 在一个 string 中首次出现的位置。
  • 基于字符数执行一个多字节安全的 strpos() 操作。 第一个字符的位置是 0,第二个字符的位置是 1,以此类推。
 mb_strpos(
    string $haystack,
    string $needle,
    int $offset = 0,
    string $encoding = mb_internal_encoding()
): int

2、参数

haystack

要被检查的 string。

needle

在 haystack 中查找这个字符串。 和 strpos() 不同的是,数字的值不会被当做字符的顺序值。

offset

搜索位置的偏移。如果没有提供该参数,将会使用 0。负数的 offset 会从字符串尾部开始统计。

encoding

encoding 参数为字符编码。如果省略或是 null,则使用内部字符编码。

3、返回值

  • 返回 string 的 haystack 中 needle 首次出现位置的数值。 如果没有找到 needle,它将返回 false。

五、mb_strlen支持编码设置(第二个参数)

1、说明

mb_strlen(string $str, string $encoding = mb_internal_encoding()): mixed

获取一个 string 的长度。

2、参数

str

要检查长度的字符串。

encoding

encoding 参数为字符编码。如果省略或是 null,则使用内部字符编码。

3、返回值

返回具有 encoding 编码的字符串 str 包含的字符数。 多字节的字符被计为 1。

如果给定的 encoding 无效则返回 false。

六、更多类似的函数 mb_***

  • 更多类似的函数 mb_***

猜你喜欢

转载自blog.csdn.net/qq_36025814/article/details/129643746