php中关于含Unicode编码字符路径文件读取失败问题
最近在实现一个读取视频文件的需求,使用的语言是php。由于某些文件比较大,所以使用了splFileObject这个类。读取一些纯英文的路径没问题,含中文的路径转码为gb2312也没问题,但是在读取某些整体路径含有Unicode字符的文件名,就会报错并无法读取(Unknown Error)。路径类似于下面:
//文件绝对路径
$filename = "E:/test/视频/Video 안녕하세요.mkv";
//创建文件对象,报错
$fileObj = new splFileObject($filename, 'r');
刚开始以为是库的问题,后来接连使用了fopen、file_get_contents,都是一样无法读取。想使用exec()调用ffmpeg生成该视频的缩略图,也无法读取这个文件的路径。但是直接在命令行里输入,又可以执行。
目前已确定php的编码设置成了utf8,mbstring扩展正常运行。要怎么才能在splFileObject和exec中正常读取该路径呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
终于找到解决方案了!
PHP 7.1开始,在win10下会默认将读文件等等与系统编码的相关操作,全部以UTF8编码执行。所以只需要将PHP版本升至7.1即可解决。
期间还试过另一种方法:将win10的Unicode语言支持打开,相当于直接改变系统编码;不过这个功能只有少部分版本的系统支持,通用性不高,后续没有深究。
最后总结下解决方案,一句话:升至PHP 7.1!
我在 Mac OSX 和 CentOS 上都试了,不会出现读取不了的现象,我怀疑是不是你的 php 文件的编码和操作系统的编码不一致导致的(也就是
Video 안녕하세요.mkv
这个文件名)