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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 09:57:06