PHP检测文件系统编码/保存具有非拉丁文件名的文件

PHP检测文件系统编码/保存具有非拉丁文件名的文件,php,unicode,filesystems,Php,Unicode,Filesystems,我需要使用PHP在文件系统上保存非拉丁文件名的文件 我想让这项工作跨平台进行。如何知道可以使用什么编码来编写文件?我知道许多现代文件系统都是基于UTF-8的(这是正确的吗?),但我怀疑Windows XP是否是(例如) 那么,是否有一个健壮的检测机制呢?这并不是对您的问题的答案,但是如果您不需要在文件系统级别执行大量操作(如搜索、排序…),那么有一个很好的跨平台解决方案,可以解决以下问题:URLEncode()ing filename Hörensägen.txt 变成 H%c3%b6ren

我需要使用PHP在文件系统上保存非拉丁文件名的文件

我想让这项工作跨平台进行。如何知道可以使用什么编码来编写文件?我知道许多现代文件系统都是基于UTF-8的(这是正确的吗?),但我怀疑Windows XP是否是(例如)


那么,是否有一个健壮的检测机制呢?

这并不是对您的问题的答案,但是如果您不需要在文件系统级别执行大量操作(如搜索、排序…),那么有一个很好的跨平台解决方案,可以解决以下问题:
URLEncode()
ing filename

Hörensägen.txt 
变成

H%c3%b6rens%c3%a4gen.txt
它应该可以在任何文件系统中安全使用,并且能够映射任何UTF-8字符


我发现这比试图“本机”处理主机操作系统的功能要好得多,因为主机操作系统的功能保证是复杂和容易出错的(除了操作系统的差异之外,我确信各种文件系统格式——FAT16、FAT32、NTFS、extFS 1/2/3版……都有自己的规则需要注意。)

PHP7.1在Windows上支持UTF-8文件名(在更新PHP和Apache之前,我在提供文件名中包含西里尔字母的文件时遇到了一个问题),因此,如果您只需更新PHP,这是当今最健壮和跨平台的解决方案


我甚至不需要
ini_集('mbstring.internal_encoding','UTF-8')
用于
文件\u获取\u内容
以正确处理非拉丁路径。

如果将文件写入磁盘,我总是将非拉丁字符转换为拉丁等效字符,并从文件名中删除标点。您能保证您的用户将安装适当的语言环境吗?NTFS(在WinXP等中使用)使用utf-16。windows上的PHP5.x使用IUSR的代码页,例如拉丁语。我听说PHP6将在上使用utf16windows@GregK:我正在处理的项目是一个WebDAV服务器,所以我需要一个干净的映射。这个问题与NTFS/Windows有关:,请参阅一个不错的建议。我想我可以提供选择。您链接的问题还提到Windows使用ISO-8859-1。@不完全是这样,据我所知,Windows的字符串处理已经基于UTF-16很长时间了,答案声称PHP的Windows文件系统函数包装器使用ISO-8859-1。我不知道这是不是真的,但这是可能的。