PHP导出CSV UTF-8转GBK不乱码的解决办法
2013-12-27 11:45 斌哥tobin 阅读(1227) 评论(0) 收藏 举报折腾了几次 搜索了好久 终于找到办法
/**
* http://yige.org/php/
* @ string 需要转换的文字
* @ encoding 目标编码
**/
function convert_encoding($string, $encoding = 'gbk'){
$is_utf8 = preg_match('%^(?:[\x09\x0A\x0D\x20-\x7E]| [\xC2-\xDF][\x80-\xBF]| \xE0[\xA0-\xBF][\x80-\xBF] | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} | \xED[\x80-\x9F][\x80-\xBF] | \xF0[\x90-\xBF][\x80-\xBF]{2} | [\xF1-\xF3][\x80-\xBF]{3} | \xF4[\x80-\x8F][\x80-\xBF]{2} )*$%xs', $string);
if($is_utf8 && $encoding == 'utf8'){
return $string;
}elseif($is_utf8){
return mb_convert_encoding($string, $encoding, "UTF-8");
}else{
return mb_convert_encoding($string, $encoding, 'gbk,gb2312,big5');
}
}
应用办法
/**
* 输出一个csv头,用于下载
* @param string $filename, 输出的下载文件名
* @return null
*/
function csv_header_4_downloading($filename, $encode = 'UTF-8')
{
header('Content-Encoding: ' . $encode);
header('Content-type: text/csv; charset=' . $encode);
header("Content-Disposition: attachment; filename={$filename}.csv");
if (strtolower($encode) == 'utf-8') echo "\xEF\xBB\xBF"; // UTF-8 BOM
}
/**
* 导出数据为excel表格
*@param $data 一个二维数组,结构如同从数据库查出来的数组
*@param $title excel的第一行标题,一个数组,如果为空则没有标题
*@param $filename 下载的文件名
*@examlpe
$stu = M ('User');
$arr = $stu -> select();
exportexcel($arr,array('id','账户','密码','昵称'),'文件名!');
*/
function export2excel($data=array(), $title=array(), $filename='report'){
ob_clean();
csv_header_4_downloading($filename, 'gbk');
//导出xls 开始
if (!empty($title)){
foreach ($title as $k => &$v) {
$v = convert_encoding($v, 'gbk');
}
$title= implode("\",\"", $title);
echo "\"$title\"\r\n";
}
if (!empty($data)){
foreach($data as $key => &$val){
foreach ($val as $ck => &$cv) {
$cv = str_replace(',', ',', $cv);
$cv = str_replace("\"", "\\\"", $cv);
$cv = str_replace("\r", "", $cv);
$cv = str_replace("\n", "", $cv);
$cv = strip_tags($cv);
$cv = convert_encoding($cv, 'gbk');
}
$val = implode("\",\"", $val);
echo "\"$val\"\r\n";
}
}
exit();
}
浙公网安备 33010602011771号