php + mysql +csv导出数据以及编码问题。
php + mysql +csv导出数据以及编码问题。
季书歌 发表于8个月前
php + mysql +csv导出数据以及编码问题。
  • 发表于 8个月前
  • 阅读 22
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

摘要: 如果php导出csv格式的数据,会比导出原生excel文件性能高的多。而且不用借助phpexcel插件以及iconv错误Detected an illegal character in input string问题
$mysqli=new mysqli("localhost","root","root","demo")or die("数据库连接失败");
$mysqli->query("set names utf8");

$sql="SELECT * FROM ....................";

$result=$mysqli->query($sql);

$cnt = 0;
$limit=100000;

$str = "渠道,姓名,手机号码,创建时间戳,企业,礼拜,时间日期,推广状态,邀约状态\n";
$str = iconv('utf-8','GB18030',$str);


while ($rows=$result->fetch_assoc()){

	$cnt ++;
	if ($limit == $cnt) { //刷新一下输出buffer,防止由于数据过多造成卡死问题
		ob_flush();
		flush();
		$cnt = 0;
	}

	$source_name = iconv('utf-8','GB18030',$rows['sname']); //中文转码
	$iname = iconv('utf-8','GB18030',$rows['name']);
	$iphone = iconv('utf-8','GB18030',$rows['phone']);
	$ctime = iconv('utf-8','GB18030',$rows['ctime']);
	$enterprise_name = iconv('utf-8','GB18030',$rows['enname']);
	$week = iconv('utf-8','GB18030',$rows['week']);
	$dates = iconv('utf-8','GB18030',$rows['dates']);
	$imname = iconv('utf-8','GB18030',$rows['imname']);
	$custname = iconv('utf-8','GB18030',$rows['custname']);
	$str .= $source_name.",".$iname.",".$iphone.",".$ctime.",".$enterprise_name.",".$week.",".$dates.",".$imname.",".$custname."\n"; //用引文逗号分开

}
$filename = date('Ymd').'.csv'; //设置文件名


export_csv($filename,$str); //导出



function export_csv($filename,$data) {
	header("Content-type:text/csv");
	header("Content-Disposition:attachment;filename=".$filename);
	header('Cache-Control:must-revalidate,post-check=0,pre-check=0');
	header('Expires:0');
	header('Pragma:public');
	echo $data;
}


由于GB 2312-80只收录6763个汉字,有不少汉字,如部分在GB 2312-80推出以后才简化的汉字(如“啰”),部分人名用字(如中国前总理朱镕基的“镕”字),台湾及香港使用的繁体字,日语及朝鲜语汉字等,并未有收录在内。----基维百科

因此当原文中出现不包含在这“6763个汉字”中的字时iconv函数是无法解析的,于是出现了报错问题,按此思路,解决方法就是将代码中的GB2312解析改成GBK解析,

由于GBK向下完全兼容GB2312-80编码。支持GB2312-80编码不支持的部分中文姓,中文繁体,日文假名,还包括希腊字母以及俄语字母等字母,因此在重新运行程序后iconv报错就基本消失了,但仍然出现了几个错误,目测仍然是类似的问题,遇到这种情况再向上升级编码即可,由于GB18030编码基本兼容GBK编码,又扩充了百余个词,因此将代码改成

$imname = iconv('utf-8','GB18030',$rows['imname']);
共有 人打赏支持
粉丝 0
博文 57
码字总数 19795
×
季书歌
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: