PHP从CSV生成数组时非英文字符显示为问号问题求助
问题:PHP读取UTF-8编码的CSV文件非英文字符显示为问号
我在PHP中尝试通过以下方式从CSV文件生成数组:
// CSV文件处理代码 $csv = array_map('str_getcsv', file("{$uploadPath}/{$myFile}"));
该代码可正常运行,但存在问题:若CSV文件包含非英文字符,这些字符在PHP中无法正常显示,会被替换为问号,以下是$csv数组的输出示例:
Array ( [0] => Array ( [0] => SISP-0002 [1] => Harpic Floral 500ml [2] => ???????? ??????? 500ml [3] => 4792037107765 ) )
补充说明
我已经在页面标签中设置了字符集:
<meta charset="utf-8">
同时CSV文件也已经以Unicode(UTF-8)格式保存,请问有什么可行的解决方案可以修复这个问题?
解决方案
方案1:调整PHP区域编码配置
str_getcsv的编码解析逻辑依赖PHP运行环境的区域设置,默认未适配UTF-8的场景下就会出现乱码,你可以在读取CSV前先设置区域编码:
// 兼容多平台的UTF-8区域配置 setlocale(LC_ALL, 'zh_CN.UTF-8', 'en_US.UTF-8', 'C.UTF-8', 'Chinese_China.65001'); $csv = array_map('str_getcsv', file("{$uploadPath}/{$myFile}"));
方案2:手动转码解析(兼容性更好)
如果你的主机环境禁止修改系统区域配置,可以选择手动处理文件编码后再解析,同时兼容带BOM头的UTF-8 CSV文件(多为Excel导出):
// 读取文件原始内容 $fileContent = file_get_contents("{$uploadPath}/{$myFile}"); // 自动识别编码转为标准UTF-8 $fileContent = mb_convert_encoding($fileContent, 'UTF-8', mb_detect_encoding($fileContent, ['UTF-8', 'GBK', 'GB2312', 'BIG5', 'CP1251'])); // 去除UTF-8 BOM头,兼容所有PHP版本 if (substr($fileContent, 0, 3) === pack('CCC', 0xef, 0xbb, 0xbf)) { $fileContent = substr($fileContent, 3); } // 逐行解析CSV $csv = []; foreach (explode(PHP_EOL, $fileContent) as $line) { $trimmedLine = trim($line); if ($trimmedLine) { $csv[] = str_getcsv($trimmedLine); } }
注意事项
如果CSV文件是从Windows端的Excel导出,默认编码为GBK/GB2312而非UTF-8,方案2已经兼容这类场景,不需要额外修改文件编码。
内容的提问来源于stack exchange,提问作者user3733831
相关产品推荐
相关产品推荐

