使用错误的文件编码(不是 UTF-8)上传 CKEditor 文件

CKEditor file upload with wrong file encoding (not UTF-8)

我在 Windows IIS 上使用 PHP 5.6。通过 ckeditor 创建 link 并为该 link 上传文件时,服务器上的文件名不包含特殊字符,例如:ČĆŽŠĐ。问题仅在通过 ckeditor 上传文件时出现。将文本上传到数据库时,编码没有问题。我怎样才能让 ckeditor 告诉服务器正确的编码,也许包括我请求的编码,或者我需要做的任何事情才能让它工作?这种 PHP 编码是一场噩梦!

我已经用这个修复了它:

iconv("utf-8", "cp1250", $_FILES['upload']['name'])

但是,难道我无法告诉 PHP 将所有内容都视为 UTF-8 编码吗?我已经尝试将 php.ini 中有关编码和代码页的每个设置都设置为 UTF-8,但没有帮助。这真的看起来不一致和挑剔。有 PHP 专家能告诉我解决这个问题的简单方法吗?

这些是上传headers:

POST https://nsdmup-a.hr/cms/news_fileupload.php?CKEditor=fullText&CKEditorFuncNum=1&langCode=en HTTP/1.1
Host: nsdmup-a.hr
Connection: keep-alive
Content-Length: 1069214
Cache-Control: max-age=0
Origin: https://nsdmup-a.hr
Upgrade-Insecure-Requests: 1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarysc0FA4jsjDe2Z4s8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: https://nsdmup-a.hr/cms/news_add.php?editId=293
Accept-Encoding: gzip, deflate, br
Accept-Language: hr-HR,hr;q=0.9,en-US;q=0.8,en;q=0.7,sr;q=0.6,bs;q=0.5,ja;q=0.4
Cookie: PHPSESSID=45iuc1r017sb75bte57dl0te71

------WebKitFormBoundarysc0FA4jsjDe2Z4s8
Content-Disposition: form-data; name="upload"; filename="511-D-022-2018. dopis ministru - zapšljavanje namještenika2.pdf"
Content-Type: application/pdf

这是他写入磁盘的文件名: "511-D-022-2018. dopis ministru - zapšljavanje namjeˇtenika2.pdf"

根据我的经验,这是 Windows 和 v7.0

之前所有 PHP 版本的问题

因此,您要么继续使用 iconv 功能,要么将 PHP 升级到至少 v7.1 (changelog regarding Windows)

您还可以创建一个辅助函数,内容如下:

if (version_compare(phpversion(), '7.1.0', '<') and strtoupper(substr(php_uname('s'), 0, 3)) === 'WIN')
{
    // Windows and PHP 7.0 or less. Use iconv
    return iconv('utf-8', 'cp1250', $filename);
}
else
{
    // Should be all good
    return $filename;
}