我不能使用mkdir
创建包含 UTF-8 字符的文件夹:
<?php
$dir_name = "Depósito";
mkdir($dir_name);
?>
当我在 Windows 资源管理器中浏览此文件夹时,文件夹名称如下所示:
Depósito
我应该怎么办?
我用的是php5
Just urlencode http://php.net/urlencode所需的文件名字符串。 All返回的字符urlencode
文件名(NTFS/HFS/UNIX)有效,那么您可以urldecode
文件名恢复为 UTF-8(或它们使用的任何编码)。
注意事项(全部也适用于以下解决方案):
- 经过 url 编码后,文件名必须少于 255 个字符(可能是字节)。
- UTF-8 有多重表征 http://en.wikipedia.org/wiki/UTF-8#Precomposition_and_Decomposition对于许多字符(使用组合字符)。如果您没有规范化您的 UTF-8,您可能会在搜索时遇到问题
glob
或重新打开单个文件。
- 你不能依赖
scandir
或用于 alpha 排序的类似函数。你必须urldecode
然后文件名使用支持 UTF-8(和排序规则)的排序算法。
更糟糕的解决方案
以下是不太有吸引力的解决方案,更复杂且有更多警告。
在 Windows 上,PHP 文件系统包装器期望并返回文件/目录名称的 ISO-8859-1 字符串。这给你两个选择:
在文件名中自由使用 UTF-8,但要了解非 ASCII 字符会显得不正确PHP 之外。非 ASCII UTF-8 字符将存储为多个singleISO-8859-1 字符。例如。ó
将显示为ó
在 Windows 资源管理器中。
将文件/目录名称限制为ISO-8859-1 中表示的字符 http://en.wikipedia.org/wiki/ISO/IEC_8859-1#ISO-8859-1。在实践中,您将通过 UTF-8 字符串传递utf8_decode http://php.net/utf8_decode在文件系统函数中使用它们之前,并传递条目scandir http://php.net/scandir让你通过utf8_encode http://php.net/utf8_encode获取 UTF-8 格式的原始文件名。
警告很多!
- If any byte传递给文件系统函数匹配无效的 Windows 文件系统字符 http://en.wikipedia.org/wiki/Filename#Comparison_of_file_name_limitations在 ISO-8859-1 中,你运气不好。
- Windows may在非英语区域设置中使用 ISO-8859-1 以外的编码。我猜它通常是 ISO-8859-# 之一,但这意味着您需要使用
mb_convert_encoding
代替utf8_decode
.
这场噩梦就是为什么你应该只是音译 https://stackoverflow.com/questions/1556415/different-charset-on-different-server/1556989#1556989创建文件名。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)