PHP Notice: iconv(): Detected an illegal character in input string

今天在工作中利用iconv函数转化汉字字符串时提示如下错误:

PHP Notice: iconv(): Detected an illegal character in input string in …

出错的语句如下:

iconv("gb2312","utf-8",$content);

解决办法,将GB2312更改为GBK即可搞定:

iconv("gbk","utf-8",$content);

出现这个错误的原因是字符串$content中出现了超出gb2312范围的字符,所以iconv函数出错。因为gbk范围比gb3212范围广,又因为这两种格式的编码相同只是范围不同而已,故采用大范围的gbk来定义字符串能够包含比较多的字符,因此转化成功。

参考文献:

http://wolf123.blog.163.com/blog/static/1750542982010717532172/

PHP中Notice: unserialize(): Error at offset of bytes in on line 的解决方法

今天在工作的时候,在转化了字符串的编码格式(详见:http://www.tonitech.com/?p=822)之后,使用unserialize函数将数据储存到数据库的时候遇到了这个报错,后来发现是将gb2312转换成utf-8格式之后,每个中文的字节数从2个增加到3个之后导致了反序列化的时候判断字符长度出现了问题,所以需要使用正则表达式将序列化的数组中的表示字符长度的值重新计算一遍,代码如下:

function mb_unserialize($serial_str) {
    $out = preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $serial_str );
    return unserialize($out);
}

PHP中Notice: iconv(): Unknown error (84) 的解决办法

今天在工作的时候读取一个接口的数据使用了iconv转换字符编码格式(iconv(‘gb2312′,’utf-8’, serialize($storeData));)的时候出现了如下错误:

Notice: iconv(): Unknown error (84) 。。。。。。

读其官方文档 http://www.php.net/manual/en/function.iconv.php对参数out_charset的解释:

The output charset.

If you append the string //TRANSLIT to out_charset transliteration is activated. This means that when a character can’t be represented in the target charset, it can be approximated through one or several similarly looking characters. If you append the string //IGNORE, characters that cannot be represented in the target charset are silently discarded. Otherwise, str is cut from the first illegal character and an E_NOTICE is generated.

大概的意思就是:

如果你加上 //TRANSLIT 到out_charset 的参数后面,意味着如果找不到目标编码,则程序会去找与其相近的编码。如果你加的是//IGNORE,则不会去找相近的编码,而且只要有一个字符是程序无法识别的则将会报错。

根据上面的解释我将代码

iconv('gb2312','utf-8', serialize($storeData));

改为 

iconv('gb2312','utf-8//TRANSLIT//IGNORE', serialize($storeData));

这样就ok了!