字符编码错误

时间:2016-03-11 10:53:29

标签: php character-encoding filesystems

我的名字中包含字符的文件。

这些文件在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¬

为什么会转换为¬,我该如何获得原始角色?

1 个答案:

答案 0 :(得分:1)

请尝试在文件名的关键字符un上解压缩('C *',$ char)。然后你会注意到它已经是0xAC(即¬)。

原因是,scandir()使用Windows的8位ANSI Api进行替换,并为不在Windows-1252上的字符提供一些“最接近的匹配字符”。如果您获得文本编辑器notepad ++,将其设置为ANSI并尝试将copy复制并粘贴到其中,则可以观察到相同的行为。它将显示为¬(当我在我的系统上尝试时,它在c& p缓冲区中也发生了变化)。

你能做什么?那么这里有一些选择:

  1. 在Windows上使用shell_exec('dir / b')(我测试了这个,你得到了原始角色)
  2. 假设¬表示⌐表示Windows上的文件名,只需在utf-8转换后将其替换回来
  3. 更改您的软件系统,使文件名中不再使用字符<
  4. 使用一些具有函数stream_encoding的实验性php构建,并尝试下面的代码。 (注意:在以下官方版本中,即使加载了mbstring,stream_encoding也是未定义的:5.6.19 7.0.4)
  5. $myContext = stream_context_create();
    stream_encoding($myContext, 'UTF-8');
    $files = scandir('./', SCANDIR_SORT_ASCENDING, $myContext);
    

    虽然通常应避免使用shell_exec,但我认为这是您现在最好的选择。从长远来看,如果可以,你应该去3。我不建议4.(我也没有对此进行过测试)我对你的情况了解不足以判断2.是否可行。