如何检测您的脚本当前运行的文件系统的字符编码,无论是在 Windows 还是 Linux 上?
我有一个表单,用户可以在其中上传文件并为其命名。一旦上传并移动到所需的目的地,文件名称如下:
wéîrd nàmès
将以如下名称保存:
wéîr nà mès
我尝试了 iconv
和 mb_convert_encoding
但我找不到要使用的字符编码。
我不想检测文件本身的字符编码。我想检测将用于保存文件的字符编码。
这是用来上传文件的php:
mkdir ($webdir . '/files/location/' . $doc_name . '/');
if (!move_uploaded_file ($_FILES['docx_file']['tmp_name'], $webdir . '/files/location/' . $doc_name . '/' . $doc_name . '.docx')){
echo 'docx upload failed miserably..';
rmdir($webdir . '/files/location/' . $doc_name . '/');
}else{
echo 'docx upload completed successfully!';
}
假设文件名为dédé
首先,我创建文件夹 $webdir 。 '/files/location/dédé'
然后我将上传的文件移动到 $webdir 。 '/files/location/dédé/dédé.docx'
如果在移动文件时发生错误(并没有发生),我会删除最近创建的文件夹。
除了将保存为 dédé 的文件夹和文件名外,一切顺利。他们两个。
我在运行上面的脚本之前尝试过这个:
echo $doc_name . "\r\n";
echo (mb_detect_encoding($doc_name)) . "\r\n";
它给了我这个结果:
dédé
UTF-8
docx upload completed successfully!
编辑
我在运行上面的脚本之前添加了这个:
echo $doc_name . "\r\n";
echo (mb_detect_encoding($doc_name)) . "\r\n";
$doc_name = (mb_convert_encoding($doc_name, 'UTF-8', 'ASCII'));
echo $doc_name . "\r\n";
echo (mb_detect_encoding($doc_name)) . "\r\n";
$doc_name
里面有 dédé 并以 UTF-8 编码。
首先它显示了这个:
dédé
UTF-8
然后我使用 mb_convert_encoding
将其从 ASCII 转换为 UTF-8 并显示如下:
dédé
UTF-8
这正是使用的文件名,而不是 dédé
mkdir
和 move_uploaded_file
是否有可能在之前自动将字符串从 ASCII 转换为 UTF-8保存?有没有可能我已经运行了一些使这成为可能的功能?在这个之前我有一个很长的脚本在运行,我真的不能把它全部放在这里。
最佳答案
好吧,经过这么多时间我认为我的脚本在保存文件夹和文件名之前做了类似的事情:
$doc_name = mb_convert_encoding($doc_name, 'UTF-8', 'ISO-8859-1');
名称已经用 UTF-8 编码,但由于某些未知原因,我的脚本仍尝试将名称从 ISO-8859-1 编码为 UTF -8 导致将 dédé 等字符串更改为 dédé。
所以我尝试通过使用将名称从 UTF-8 编码为 ISO-8859-1 来修复它:
$doc_name = iconv('UTF-8', 'ISO-8859-1', $doc_name);
我认为我的脚本会自动将它返回到 UTF-8,我得到了这个:
Original: dédé ===> Encoded in ISO-8859-1: d�d� ===> Encoded to UTF-8: dédé
它奏效了。
mkdir(),
rmdir(),
is_dir(),
move_uploaded_files(),
file_exists(),
重命名()..
它们都需要将字符串编码为 ISO-8859-1。,但是,is_dir() 可用于 UTF-8
关于PHP - 检测文件系统的字符编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32564046/