CodeArt-编码艺术

PHP操作本地中文文件注意事项

字数统计: 697阅读时长: 3 min
2016/12/25 Share

公司,某位其他部门的同事问,有几千个文件夹,里面都有个同名的文件,想要把这几千个同名文件改为与文件夹一样的名字,是否有快速解决的工具。

等会不忙了帮你写个,我信心满满的答应下来。

但在此中操作中文文件时,遇到了点小问题,遂记录下来与大家分享

问题出现在遍历目录,操作中文名文件的过程中。

其类似于此种结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$dir = 'wj';
//打开目录存入句柄
if($dh = opendir($dir))
{
//循环遍历
while (($file = readdir($dh)) !== false)
{
//匹配则进入操作
var_dump($file);
if ($file == '二维码.jpg')
{
//操作
echo '操作';
}
}
}

但我发现始终无法进入if 即使打印出的string 与文件名一毛一样,这就很尴尬啊。 我再把if条件改为

1
2
3
4
5
$file == '1.txt'

![](http://www.codeart.top/wp-content/uploads/2016/12/7e097021ac3f89a4f7b3990e9d8f924a.png)
瞬间就进来了,这说明写法没问题,难道是字符编码?
再改改编码看看效果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$dir = 'wj';
//打开目录存入句柄
if($dh = opendir($dir))
{
//循环遍历
while (($file = readdir($dh)) !== false)
{
var_dump($file);
//查询字符编码
$encode = mb_detect_encoding($file, array("ASCII",'UTF-8',"GB2312","GBK",'BIG5'));
//显示读取的file的字符编码
echo "file的字符集为:{$encode} </br>";
//转换字符编码
$file = mb_convert_encoding($file,'UTF-8',$encode);
//匹配则进入操作
if ($file == '二维码.jpg')
{
//操作
echo '6666666666666';
}
}
}

这里我查询了file的字符编码,再将其转换为utf-8,看起来妥妥的,我咋这么聪明 结果… 这就很尴尬了,还进不去,居然读不出来,这破PHP 一定是PHP本身设计的太烂,我这样安慰自己 既然是读取系统文件,查查系统是什么字符集吧,说干就干 soga,GBK是也。ps:cmd框体右击属性可查 继续改改代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$dir = 'wj';
//打开目录存入句柄
if($dh = opendir($dir))
{
//循环遍历
while (($file = readdir($dh)) !== false)
{
var_dump($file);
//转换字符编码
$file = mb_convert_encoding($file,'UTF-8','GBK');
//显示读取的file的字符编码
$encode = mb_detect_encoding($file, array("ASCII",'UTF-8',"GB2312","GBK",'BIG5'));
echo "file的字符集为:{$encode} </br>";
//匹配则进入操作
if ($file == '二维码.jpg')
{
//操作
echo '6666666666666';
}
}
}

成功进去,妥妥的。 至此,此小问题解决 操作中文文件定要注意字符编码问题(windows默认GBK) 另:此段代码后期操作了系统中的文件,在操作过程中,也定要记得转换字符编码 例如:

1
rename(iconv('UTF-8','GBK',$oldname), iconv('UTF-8','GBK',$newname));
CATALOG