无法读取UTF-8文件名

5

无法从Windows文件系统中读取UTF-8文件名(主要的Windows语言为英语)

<?php

$path_to_read = 'D:\music';

class AudioFilterIterator extends FilterIterator
{
    public function accept()
    {
        return (strpos(parent::current(), '.mp3'));
    }
}

$object = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path_to_read));

$iterator = new AudioFilterIterator($object);

echo "<pre>";

$files = array();

foreach($iterator as $file)
{
    echo $file . "\n";
}

所以,举个例子,我有一个名为“10 Hört auf.mp3”的文件,但输出结果是“10 Hort auf.mp3”。
我该如何解决这个问题?

1
你尝试过使用 utf8_encode() 吗?不管怎样,如果你保存文件时避免使用特殊字符,这个问题就不会存在了。 - Jonast92
为什么不使用 readdir()preg_match() 呢?这段代码对于它所做的事情来说相当沉重。 - user1544337
1
Windows中的文件名不是以UTF16编码吗?请参见https://dev59.com/RnI-5IYBdhLWcg3wBjhR#2051018。 - SirDarius
请检查您是否在头部添加了<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - tuxnani
1
@CamilStaps - 我不同意。readdir()需要您自己实现递归遍历目录结构的逻辑,并且在使用正则表达式匹配文件名时,简单的 strpos() 即可完成,而使用正则表达式会增加不必要的开销。我认为 OP 提供的示例代码轻量且是我推荐的方法。 - nickb
2个回答

0
你可以使用iconv函数轻松完成。 Windows的示例:
iconv("WINDOWS-1250", "UTF-8", $name);

1
不要混淆人们。WinAPI根本无法检索UTF8名称,iconv也无法帮助任何事情。 - Danny
1
就像我说的,在Windows 7和xampp上它对我来说完美地工作。在发表评论之前,您也可以尝试一下。 - Sonic03

0
由于PHP在没有合理的UTF-8支持的WinAPI下工作,因此无法解决这个错误。

你的意思是在Linux上没有问题吗? - hpaknia
MS Windows是基于UTF-16构建的,可以在不丢失任何信息的情况下转换为UTF-8。它甚至配备了在UTF-16和UTF-8之间自由转换的功能。其余的只是实现质量的问题。 - Ulrich Eckhardt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接