PHP -检测文件系统的字符编码


PHP - Detect the character encoding of the file system

如何检测您的脚本当前运行的文件系统的字符编码,无论它是在Windows还是Linux上?

我有一个表单,用户将上传一个文件,并给它一个名称。一旦上传并移动到所需的目的地,文件名如下所示的文件:

wéîrd nàmès

将以如下名称保存:

wéîr nàmès

我尝试了iconvmb_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

是否有可能mkdirmove_uploaded_file在保存之前自动将字符串从ASCII转换为UTF-8 ?有没有可能我已经运行了一些函数使它成为可能?在这之前我有一个很长的脚本在运行我不能把它都放在这里

好了,经过这么多时间,我发现我的脚本在保存文件夹和文件名之前做了这样的事情:

$doc_name = mb_convert_encoding($doc_name, 'UTF-8', 'ISO-8859-1');

名称已经编码在UTF-8,但由于一些未知的原因,我的脚本仍然试图编码名称从ISO-8859-1UTF-8,这导致更改字符串,如 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 () ,

删除文件夹(),

<

作用是:判断给定文件名是否是/strong>,

函数(),

file_exists () ,

rename () .

它们都需要用ISO-8859-1编码的字符串。然而,<>, is_dir () utf - 8