一、问题
- 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_***