我的名字中包含字符⌐
的文件。
这些文件在Linux(Apache / php)下得到很好的处理:
$files = scandir($path);
echo json_encode($files);
file1⌐
file2⌐
file3⌐
file4⌐
在Windows下,文件系统似乎将其视为 Windows-1252 ,因此我必须有条件地将其转换为json_encode
才能正常工作
$files = scandir($path);
foreach ($files as $i => $file) {
$files[$i] = mb_convert_encoding($file, 'UTF-8', 'Windows-1252');
}
echo json_encode($files);
以下是转换方式
file1¬
file2¬
file3¬
file4¬
为什么⌐
会转换为¬
,我该如何获得原始角色?
答案 0 :(得分:1)
请尝试在文件名的关键字符un上解压缩('C *',$ char)。然后你会注意到它已经是0xAC(即¬)。
原因是,scandir()使用Windows的8位ANSI Api进行替换,并为不在Windows-1252上的字符提供一些“最接近的匹配字符”。如果您获得文本编辑器notepad ++,将其设置为ANSI并尝试将copy复制并粘贴到其中,则可以观察到相同的行为。它将显示为¬(当我在我的系统上尝试时,它在c& p缓冲区中也发生了变化)。
你能做什么?那么这里有一些选择:
$myContext = stream_context_create();
stream_encoding($myContext, 'UTF-8');
$files = scandir('./', SCANDIR_SORT_ASCENDING, $myContext);
虽然通常应避免使用shell_exec,但我认为这是您现在最好的选择。从长远来看,如果可以,你应该去3。我不建议4.(我也没有对此进行过测试)我对你的情况了解不足以判断2.是否可行。