先来看代码

<?php
$charset = 'GBK';
$str = '中华人民共和国中华人民共和国中华人民共和国中华人民共和国';
$size = 17;
//先创造一个 GBK 编码的字符串
$str2 = iconv('UTF-8', $charset, $str);
$str3 = substr($str2, 0, $size);//.$str2;
$s = iconv($charset, 'UTF-8//IGNORE', $str3);
var_dump($s);

这里GBK因为一个汉字字符算2个英文字符 所以当长度为17的时候 会有字符破损

经过转换 UTF-8 并且忽略不合法字符的时候,结果竟然是 false 和文档中说的忽略字符返回值达不到预期效果,经过测试发现这种情况仅出现在末尾字符不合法的时候 当拼接其他字符的时候(注释掉的部分)返回是达到预期的

这个问题在 iconv 原版是不会出现的,也就是说这是 PHP 版本独有的问题

在命令行下测试iconv工具

iconv -c -f gbk -t utf-8 input

input为 17长度的$str3输出的内容

结果iconv的输出是忽略了最后那半个破损的字符

以下为无证大师原话

c的iconv即使加//ignore也会返回错误码
处理不处理要调用方决定
但php没做
因此,php巨烂
等人喷