如何列出文件具有特殊(挪威)字符
我做一个简单的(我认为)文件的目录列表,像这样:如何列出文件具有特殊(挪威)字符
$files = scandir(DOCROOT.'files');
foreach($files as $file)
{
echo ' <li>'.$file.PHP_EOL;
}
的问题是文件中包含的字符挪威(AE,O, å),他们出于某种原因出现了问号。为什么是这样?
我可以这样做显然是解决这个问题之前,我赞同它(?):
$file = mb_convert_encoding($file, 'UTF-8', 'pass');
但是这是毫无意义的,我为什么这会有所帮助,因为通应该意味着没有字符编码转换进行,根据该文档... *混淆*
它看起来文件名的编码是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
参数时使用。
更新了测试页面,尝试auto和iso-8859-1作为'from'。 iso-8859-1确实有效,但对于汽车来说,这些字母似乎只是消失了?还尝试把它放在不同的服务器上,结果是相反的:s - > http://random.geekality.net/files/ – Svish 2012-03-02 12:23:32
有一件事是肯定的:你必须*知道*什么编码你正在处理和适当地转换。让一段软件试图以任意编码方式进行自动转换,必然会给你带来相当随机的结果。为什么它表现这种特殊的随机是任何人的猜测。 – deceze 2012-03-02 12:55:30
但是,如果我部署到随机服务器,我怎么知道我应该使用什么编码?我的意思是,从mb_internal_encoding转换在我的一个例子中失败。 – Svish 2012-03-02 15:34:51
我没有答案,但我有一个提示:尝试使用'DirectoryIterator'(http://php.net/manual/en/class.directoryiterator.php)这是一个比“ scandir',它可能会更好。 – 2012-02-29 21:00:14
您使用的是Windows吗? – 2012-02-29 21:02:32
@webarto是的,但我在运行* nix的Web主机上遇到了同样的问题。 – Svish 2012-02-29 21:39:34