日期:2014-05-17  浏览次数:20449 次

php 5.2.4 iconv函数TRANSLIT 有时不靠谱

php 版本 5.2.4

问题:文件字符串转码时按字节截断不当

比如

$str = “公司”;                                  //默认以UTF-8编码
$str = Simple_Util_String::msubstr($str, 4);	// 按字节截取前4个字节,原字符串有6个字节
$str .= “adfadsfasdfadsfasdf”; 			//拼接后面的字符串  (执行下一步后,这些字符就消失了)
$str = iconv("UTF-8", "GBK//TRANSLIT",$str);    // 转码 , 遇到不认识的字符串进行转写

执行此步时,“公司”的“司”字编码不完整,iconv不认识,但iconv没有转写,而是做了截断。导致$str后面的字符串也没有转换成功,“adfadsfasdfadsfasdf”丢失了。在一些商业产品,尤其是有关统计的系统里,这是很危险的。

解决方法是:

改变iconv第二个参数。

$str = iconv("UTF-8","GBK//IGNORE", $str);

总结:iconv的TRANSLIT并不靠谱,遇到不认识也不能转写的字符串,也可能截断。保险的方法是用IGNORE。