You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 20:23:17