我正在做一个简单的(我认为)文件目录列表,如下所示:
$files = scandir(DOCROOT.'files');
foreach($files as $file)
{
echo ' <li>'.$file.PHP_EOL;
}
问题是这些文件包含挪威字符(æ,ø,å),它们由于某种原因而出现问号。这是为什么?
我可以通过这样做来明确修复(?)它,然后再回复它:
$file = mb_convert_encoding($file, 'UTF-8', 'pass');
但是对我来说没什么意义有帮助,因为传递应该意味着没有执行字符编码转换,根据文档... * confused * < / p>
答案 0 :(得分:1)
文件名的编码似乎是ISO Latin 1,但默认情况下使用UTF-8解释页面。字符不是&#34;问号&#34;,而是Unicode替换字符(�)。这意味着尝试将字节流解释为UTF-8的浏览器在UTF-8中遇到无效的字节,并在该点插入字符。将您的浏览器切换到ISO Latin 1并查看差异(查看&gt;编码&gt; ...)。
因此,如果您将页面指定为UTF-8编码,那么您需要做的是将字符串从ISO Latin 1转换为UTF-8。使用mb_convert_encoding($file, 'UTF-8', 'ISO-8859-1')
来执行此操作。
如果您将$from
编码指定为pass
我只能猜测,为什么会有效。你告诉mb_convert_encoding
的是pass
转换为UTF-8。我想这会使mb_convert_encoding
将mb_internal_encoding
值作为$from
编码,恰好是ISO Latin 1.我认为它在使用{@ 1}}时相当于'auto'
作为$from
参数。