GB2312:信息交换用汉字编码字符集(不支持生僻字的字符集,这是其本身限制的问题)。
GBK:汉字编码字符集,向下与GB2312兼容(支持生僻字的字符集)。
UTF-8:是一种针对Unicode的可变长度字符编码,又称万国码。
现在手上一个项目正在上传基础数据,客户反馈某数据上传失败,我研究之后发现是客户上传的数据中“蘴”字导致的。可能之前code时没有注意生僻字转换的问题。
首先贴上出错的上传数据“某某县某某田园蘴农业科技有限公司”,百度了一下,“蘴”读音为“feng”,读一声。
问题代码:
$data[$i] = iconv('gb2312', 'utf-8', $temp); //iconv(原编码, 目标编码, 要转的字符串)
这行代码本身没有错误,转换非生僻字也不会出错,但因生僻字“蘴”字的原因转换失败,转换为“false”。
然后网上找类似问题,但发现根据如下网上的答案并没有从根本上解决这个问题:
$data[$i] = iconv('gb2312', 'utf-8//IGNORE', $temp);
加上“//IGNORE”会让iconv()函数忽略错误,继续执行。
但转换为“某某县某某田园t农业科技有限公司”,此方法只是“压制”错误,将“蘴”错误的转换为“t”。
此函数不行,那就换一个函数:
$data[$i] = mb_convert_encoding($temp, 'utf-8', 'gb2312'); //mb_convert_encoding(要转的字符串, 目标编码, 原编码)
转换为“连平县鸿益田园?农业科技有限公司”,此方法与上面函数相同,只是“压制”错误,将“蘴”错误的转换为“?”
此时,我才意识到,不是函数的问题,是编码的问题:GB2312是不支持生僻字的。
果然,将编码换了一下这个问题就解决了:
$data[$i] = mb_convert_encoding($temp, 'utf-8', 'gbk');
转换为“某某县某某田园蘴农业科技有限公司”,转换成功。
吃一堑长一智,提醒自己这么“弱智”的问题要牢记!!!