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()