我正在尝试上传一个以阿拉伯语命名的文件,上传保存在数据库中的文件并正确地使用阿拉伯语名称,但是在目标文件夹中,文件没有以正确的名称保存...所以什么是问题在这里?
答案 0 :(得分:1)
是的,它的窗口
PHP和其他使用MS C运行时stdio文件处理实现的应用程序无法处理具有机器默认代码页之外字符的Windows文件名。如果服务器设置为阿拉伯语,您可以上传阿拉伯语(但不能上传中文或拉丁语)。从理论上讲,您可以将进程的代码页设置为UTF-8(65001),但C运行时中存在严重的错误,这使得这个错误不可靠。
如果您需要Unicode文件名支持,则必须直接调用Win32 W
API,而不是依赖于标准文件IO,除非语言内置支持,否则这需要很多工作(.NET)语言和Python做; PHP没有。)
允许用户指定用于服务器端文件系统存储的文件名是危险的,很难做到正确,尤其是在Windows下。通常最好使用代理文件名,例如123.dat
,其中123
可能是数据库行ID。这也使得Unicode问题消失了。 (如果要直接提供它们,可以使用重写使它们看起来在外部具有更友好的名称。通过IRI编码,URL可以很容易地在路径中包含Unicode字符。)