只需
urlencode所需的字符串作为文件名。从urlencode返回的所有字符在文件名(NTFS / HFS / UNIX)中有效,然后您可以将文件名返回到UTF-8(或它们所在的任何编码)。
警告(也适用于以下解决方案):
>在url编码后,文件名必须少于255个字符(可能是字节)。
>对于许多字符,UTF-8具有multiple representations(使用组合字符)。如果您不规范化您的UTF-8,您可能无法使用glob搜索或重新打开单个文件。
>你不能依靠scandir或类似的函数进行alpha排序。您必须对文件名进行urldecode,然后使用识别UTF-8(和归类)的排序算法。
更糟糕的解决方案
以下是不太有吸引力的解决方案,更复杂和更多的警告。
在Windows上,PHP文件系统包装器期望并返回文件/目录名称的ISO-8859-1字符串。这给你两个选择:
>在您的文件名中自由使用UTF-8,但应理解,非ASCII字符在PHP外部将显示不正确。非ASCII UTF-8字符将存储为多个单独的ISO-8859-1字符。例如。 ó将在Windows资源管理器中显示为ó。
>将您的文件/目录名称限制为characters representable in ISO-8859-1.实际上,在将文件系统函数中使用它们之前,您将传递您的UTF-8字符串通过utf8_decode,并传递条目scandir给您通过utf8_encode得到原始文件名为UTF-8。
注意事项!
>如果传递到文件系统函数的任何字节与ISO-8859-1中的invalid Windows filesystem character匹配,则表示运气不好。
> Windows可以在非英语区域设置中使用ISO-8859-1之外的编码。我猜想它通常是ISO-8859-#之一,但这意味着你需要使用mb_convert_encoding而不是utf8_decode。
这个噩梦是为什么你应该只是transliterate创建文件名。