如何检测您的脚本当前运行的文件系统的字符编码,无论它是在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
首先创建文件夹$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
内部有 dsamdase ,编码为UTF-8。
首先显示如下:
dédé
UTF-8
然后我使用mb_convert_encoding
将其从ASCII转换为UTF-8,它显示如下:
dédé
UTF-8
这就是用来代替的文件名。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
所以我试图通过使用:
将名称从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 () ,
删除文件夹(),
<作用是:判断给定文件名是否是/strong>,
函数(),
file_exists () ,
rename () .
它们都需要用ISO-8859-1编码的字符串。然而,<>, is_dir () 与 utf - 8