如何检测脚本当前运行的文件系统的字符编码,无论是在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 ?是否有可能我运行了一些使这成为可能的功能?我有一个非常长的脚本在此之前运行,我不能真正把它放在这里。
答案 0 :(得分:2)
好的,经过这么多时间我发现我的脚本在保存文件夹和文件名之前做了类似的事情:
$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 强>