如何列出文件具有特殊(挪威)字符

问题描述:

我做一个简单的(我认为)文件的目录列表,像这样:如何列出文件具有特殊(挪威)字符

$files = scandir(DOCROOT.'files'); 

foreach($files as $file) 
{ 
    echo ' <li>'.$file.PHP_EOL; 
} 

的问题是文件中包含的字符挪威(AE,O, å),他们出于某种原因出现了问号。为什么是这样?

我可以这样做显然是解决这个问题之前,我赞同它(?):

$file = mb_convert_encoding($file, 'UTF-8', 'pass'); 

但是这是毫无意义的,我为什么这会有所帮助,因为通应该意味着没有字符编码转换进行,根据该文档... *混淆*


下面是一个例子:http://random.geekality.net/files/index.php

+0

我没有答案,但我有一个提示:尝试使用'DirectoryIterator'(http://php.net/manual/en/class.directoryiterator.php)这是一个比“ scandir',它可能会更好。 – 2012-02-29 21:00:14

+0

您使用的是Windows吗? – 2012-02-29 21:02:32

+0

@webarto是的,但我在运行* nix的Web主机上遇到了同样的问题。 – Svish 2012-02-29 21:39:34

它看起来文件名的编码是ISO拉丁语1,但该页面默认使用UTF-8解释。字符不是作为“问号”出现,而是作为Unicode替换字符( )出现。这意味着试图将字节流解释为UTF-8的浏览器在UTF-8中遇到了无效的字节,并在该位置插入了字符。将您的浏览器切换到ISO Latin 1并查看其差异(查看>编码> ...)。

因此,如果您将页面指定为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拉丁1.我想这等于'auto'作为$from参数时使用。

+0

更新了测试页面,尝试auto和iso-8859-1作为'from'。 iso-8859-1确实有效,但对于汽车来说,这些字母似乎只是消失了?还尝试把它放在不同的服务器上,结果是相反的:s - > http://random.geekality.net/files/ – Svish 2012-03-02 12:23:32

+0

有一件事是肯定的:你必须*知道*什么编码你正在处理和适当地转换。让一段软件试图以任意编码方式进行自动转换,必然会给你带来相当随机的结果。为什么它表现这种特殊的随机是任何人的猜测。 – deceze 2012-03-02 12:55:30

+0

但是,如果我部署到随机服务器,我怎么知道我应该使用什么编码?我的意思是,从mb_internal_encoding转换在我的一个例子中失败。 – Svish 2012-03-02 15:34:51