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

XHR上传文件重命名(含特殊字符)跨平台异常问题求助

解决Windows上传含特殊字符文件名乱码(问号替换)的问题

根据你描述的情况,Mac上传正常但Windows上传后特殊字符变成问号,核心原因是Windows和Mac系统下浏览器传递文件名的编码差异,加上你的PHP清洗函数强制UTF-8转ISO-8859-1导致乱码。下面是具体的排查和解决步骤:

一、问题根源分析

  1. 编码传递差异:Mac的浏览器(如Chrome/Safari)默认以UTF-8编码传递文件名,而Windows系统的浏览器可能使用系统默认编码(如GBK/CP1252)传递文件名。
  2. 清洗函数的硬编码转码:你的cleanStr函数里用iconv("UTF-8", "ISO-8859-1//IGNORE", $txt)强制转码,如果Windows传递的文件名不是UTF-8编码,无法识别的字符就会被替换成问号。
  3. FTP删除失败:因为服务器上的文件名已经是乱码(问号),FTP客户端的编码和服务器文件名编码不匹配,导致无法识别和删除。

二、具体解决方案

1. 先检测文件名的实际编码

在PHP处理文件前,先确认Windows传递过来的文件名编码,便于针对性处理。在你的文件处理代码中添加:

$original_name = $docs['name'][$key];
// 检测文件名编码
$detected_encoding = mb_detect_encoding($original_name, ['UTF-8', 'GBK', 'CP1252', 'ISO-8859-1'], true);
// 可以打印日志或者临时输出查看
error_log("Original name: $original_name, Encoding: $detected_encoding");

这一步能帮你确认Windows下的文件名编码类型,确保后续转码正确。

2. 修改文件名清洗函数

去掉强制转ISO-8859-1的逻辑,先将文件名统一转成UTF-8,再处理特殊字符和标点:

static function cleanStr ( $txt, $punctuation = false ) {
    $txt = trim($txt);
    
    // 第一步:将文件名转换为UTF-8编码
    $detected_encoding = mb_detect_encoding($txt, ['UTF-8', 'GBK', 'CP1252', 'ISO-8859-1'], true);
    if ($detected_encoding && $detected_encoding !== 'UTF-8') {
        $txt = mb_convert_encoding($txt, 'UTF-8', $detected_encoding);
    }
    
    // 处理特殊字符替换
    $txt = str_replace('œ', 'oe', $txt);
    $txt = str_replace('Œ', 'Oe', $txt);
    $txt = str_replace('æ', 'ae', $txt);
    $txt = str_replace('Æ', 'Ae', $txt);
    $txt = str_replace('²', '2', $txt);
    $txt = str_replace('³', '3', $txt);
    $txt = str_replace('°', '', $txt);
    
    // 处理标点符号
    if ( $punctuation ) {
        $punct_array = array(',', ':', ';', '?', '!', '(', ')', '[', ']', '#', '&');
        $punct_array2 = array(' ', "'", '---', '--');
        $txt = str_replace($punct_array, '' , $txt);
        $txt = str_replace($punct_array2, '-' , $txt);
    }
    
    // 转小写并返回
    return strtolower($txt);
}

注意:确保你的PHP环境开启了mbstring扩展(大部分服务器默认开启,如果没有,需要在php.ini中启用extension=mbstring)。

3. 确保服务器文件系统支持UTF-8文件名

  • Linux服务器:检查系统语言环境是否为UTF-8,执行echo $LANG,确保输出类似en_US.UTF-8。如果不是,需要修改系统语言设置。
  • Windows服务器:NTFS文件系统默认支持UTF-8文件名(Windows 10及以上版本),无需额外设置。

4. 解决FTP删除问题

当文件名编码正常后,FTP客户端只要设置为UTF-8编码(大部分FTP客户端默认支持),就能正确识别文件名,从而正常删除文件。

三、测试验证

修改后,用Windows上传Reçu-de-billet-électronique.txt,应该会和Mac上传结果一致,生成recu-de-billet-electronique.txt,FTP也能正常识别和删除该文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:03:59