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); ?>
- 期望效果:西里尔字符正常显示,内容排版整齐
- 实际效果:显示为无意义的随机乱码符号
问题原因
核心是编码不匹配:
- PHP默认以UTF-8编码写入CSV,但Excel 2016默认会用系统本地编码(Windows下多为CP1251或GBK)解析CSV文件,西里尔字符在UTF-8与本地编码间无法兼容,导致乱码。
- 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
相关产品推荐
相关产品推荐

