PHP生成含波斯文的CSV文件出现乱码,如何解决?
解决PHP生成CSV时波斯文乱码问题
核心问题分析
你的代码出现乱码主要有三个原因:
- 错误将RSS源编码假设为
ISO-8859-1,波斯文RSS通常本身就是UTF-8编码,强行转码会破坏原有字符 - 生成的CSV缺少UTF-8 BOM头,多数表格软件(如Excel)需要BOM才能正确识别UTF-8编码的非英文字符
- 处理
SimpleXMLElement时的编码转换逻辑冗余,反而干扰了原生编码处理
修改后的完整代码
<?php // 获取表单提交的RSS地址 $rss_url = $_POST['rss-url']; // 加载RSS并确保UTF-8编码处理 $rss_content = file_get_contents($rss_url); // 修复XML可能存在的编码声明问题,确保SimpleXML正确识别UTF-8 $rss_content = preg_replace('/encoding="[^"]+"/', 'encoding="UTF-8"', $rss_content); $rss = new SimpleXMLElement($rss_content); // 生成CSV文件,写入UTF-8 BOM头 $filename = 'rss-data.csv'; $file = fopen($filename, 'wb'); // 使用二进制模式避免换行符问题 // 写入UTF-8 BOM,让表格软件正确识别编码 fwrite($file, "\xEF\xBB\xBF"); // 写入表头 $header_row = array('Title', 'Description', 'PublicationDate', 'Link', 'Photo'); fputcsv($file, $header_row); // 遍历RSS条目 foreach ($rss->channel->item as $item) { // 直接提取字符串,无需额外转码(SimpleXML已处理UTF-8) $title = (string) $item->title; $description = (string) $item->description; $pub_date = (string) $item->pubDate; $link = (string) $item->link; // 提取图片链接 preg_match('/<img.*?src="(.*?)".*?>/is', $description, $matches); $image = isset($matches[1]) ? $matches[1] : ''; // 清理描述中的HTML标签,写入CSV $data_row = array($title, strip_tags($description), $pub_date, $link, $image); fputcsv($file, $data_row); } // 关闭文件 fclose($file); // 跳转回首页 header('Location: index.html'); exit(); ?>
关键修改说明
- 添加UTF-8 BOM头:通过
fwrite($file, "\xEF\xBB\xBF");写入BOM,解决Excel等软件无法识别UTF-8 CSV的问题 - 移除错误编码转换:删除所有
mb_convert_encoding调用,因为波斯文RSS默认是UTF-8,强行转码会导致乱码 - 修复XML编码识别:用正则替换XML的编码声明为UTF-8,确保
SimpleXMLElement正确解析内容 - 使用二进制模式打开文件:
fopen($filename, 'wb')避免不同系统换行符差异导致的编码问题
内容的提问来源于stack exchange,提问作者Tile Soft
相关产品推荐
相关产品推荐

