Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 错误编码的字符_Php_Character Encoding_Filesystems - Fatal编程技术网

Php 错误编码的字符

Php 错误编码的字符,php,character-encoding,filesystems,Php,Character Encoding,Filesystems,我有包含字符⌐ 这些文件在Linux(Apache/php)下处理得很好: $files=scandir($path); echo json_编码($files); 文件1⌐ 文件2⌐ 文件3⌐ 文件4⌐ 在Windows下,它们似乎被文件系统读取为Windows-1252,因此我必须有条件地转换它们,以便json_encode可以工作 $files=scandir($path); foreach($i=>$file形式的文件){ $files[$i]=mb_convert_编码($file,

我有包含字符

这些文件在Linux(Apache/php)下处理得很好:

$files=scandir($path);
echo json_编码($files);
文件1⌐
文件2⌐
文件3⌐
文件4⌐

在Windows下,它们似乎被文件系统读取为Windows-1252,因此我必须有条件地转换它们,以便
json_encode
可以工作

$files=scandir($path);
foreach($i=>$file形式的文件){
$files[$i]=mb_convert_编码($file,'UTF-8','Windows-1252');
}
echo json_编码($files);
下面是他们如何转化的

文件1&
文件2&
文件3&
文件4——

为什么
正在转换为
,如何获取原始字符?

请尝试对关键字符解包('C*',$char)⌐ 您的文件名。然后您会注意到它已经是0xAC(即&)

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

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

  • 在Windows上使用shell_exec('dir/b')(我测试了这个,您得到了原始字符)
  • 假设这意味着⌐ 对于Windows上的文件名,只需在utf-8转换后重新替换即可
  • 更改您的软件系统,使角色⌐ 不再在文件名中使用
  • 使用一些具有该函数的实验性php构建,然后尝试下面的代码。(注意:在以下官方版本中,即使加载了mbstring,流_编码也未定义:5.6.19 7.0.4)
  • $myContext=stream\u context\u create();
    流_编码($myContext,'UTF-8');
    $files=scandir(“./”,scandir\u SORT\u升序,$myContext);
    

    虽然通常应该避免使用shell_exec,但我认为这是目前最好的选择。从长远来看,如果可以的话,你应该选择3分。我不推荐4。(我还没有测试过这个)我对你的场景了解不够,无法判断是否有2个。是可行的。

    不太清楚您想要什么,但我知道Linux默认使用反斜杠,windows默认使用正向斜杠(但也支持反斜杠)。奇怪的是,Windows-1252甚至没有“反向非符号”的字符编码,但它有一个“非符号”的字符编码。也许你没有像你想的那样在Windows-1252中重新获得字符串?你试过做mb_detect_encoding()只是为了确定吗?我正在使用
    mb_check_encoding
    来验证我的Windows-1252。我还尝试了
    mb\u detect\u编码
    (告诉我这不是UTF-8)。Windows-1252[19-May-2018 23:10:05 UTC]PHP中缺少“反向不符号”的一个好观点致命错误:在4.4到7.2.5的任何PHP版本中调用未定义的函数stream_encoding()