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

PHP转含西里尔字符的JSON为CSV后Excel打开乱码问题咨询

西里尔字符CSV转Excel乱码问题:原因与解决方法

问题背景

使用以下PHP代码将包含西里尔字符的JSON文件转换为CSV后,用Excel 2016打开出现乱码:

<?php 
$jsonData = file_get_contents("1.json");
$jsonDecoded = json_decode($jsonData);

$csv = '1.csv';
$fileCsv = fopen($csv, 'w');
foreach($jsonDecoded as $i){
    fputcsv($fileCsv, $i);
}

fclose($fileCsv);
?>
  • 期望效果:西里尔字符正常显示,内容排版整齐
  • 实际效果:显示为无意义的随机乱码符号

问题原因

核心是编码不匹配:

  1. PHP默认以UTF-8编码写入CSV,但Excel 2016默认会用系统本地编码(Windows下多为CP1251或GBK)解析CSV文件,西里尔字符在UTF-8与本地编码间无法兼容,导致乱码。
  2. UTF-8编码的CSV文件若缺少BOM(字节顺序标记),Excel 2016无法自动识别其为UTF-8编码,这是触发乱码的常见诱因。

解决方法

方案1:给CSV添加UTF-8 BOM

在PHP代码中写入内容前先输出UTF-8 BOM,让Excel自动识别编码:

<?php 
$jsonData = file_get_contents("1.json");
$jsonDecoded = json_decode($jsonData);

$csv = '1.csv';
$fileCsv = fopen($csv, 'w');
// 写入UTF-8 BOM标记
fwrite($fileCsv, "\xEF\xBB\xBF");
foreach($jsonDecoded as $i){
    fputcsv($fileCsv, $i);
}

fclose($fileCsv);
?>

方案2:转换CSV为Windows西里尔编码(CP1251)

将UTF-8内容转换为Excel原生支持的CP1251编码,兼容更旧版本:

<?php 
$jsonData = file_get_contents("1.json");
$jsonDecoded = json_decode($jsonData);

$csv = '1.csv';
$fileCsv = fopen($csv, 'w');
foreach($jsonDecoded as $i){
    // 逐个字段将UTF-8转CP1251
    $convertedFields = array_map(function($field){
        return mb_convert_encoding($field, 'CP1251', 'UTF-8');
    }, $i);
    fputcsv($fileCsv, $convertedFields);
}

fclose($fileCsv);
?>

方案3:手动用Excel导入CSV(无需修改代码)

如果不想改动代码,可通过Excel导入流程指定编码:

  • 打开Excel 2016,切换到「数据」选项卡,选择「自文本/CSV」
  • 选中生成的1.csv文件,在导入界面设置「文件原始格式」为「UTF-8」
  • 完成导入后,西里尔字符即可正常显示

额外说明

乱码并非仅由Excel导致:PHP生成的CSV编码与Excel默认解析编码不匹配才是核心矛盾。若用Notepad++等支持UTF-8的文本编辑器打开CSV,字符显示正常,说明文件本身编码无问题,只是Excel的默认解析逻辑引发乱码。

内容的提问来源于stack exchange,提问作者Uli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 16:05:32