一尘不染

如何使用UTF-8字符串在PHP中使用文件系统功能?

php

我不能使用mkdirUTF-8字符创建文件夹:

<?php
$dir_name = "Depósito";
mkdir($dir_name);
?>

当我在Windows资源管理器中浏览此文件夹时,文件夹名称如下所示:

Depósito

我该怎么办?

我正在使用php5


阅读 371

收藏
2020-05-26

共1个答案

一尘不染

只是urlencode所需的字符串作为文件名。 从中返回的 所有
字符urlencode在文件名(NTFS / HFS /
UNIX)中均有效,然后您可以urldecode将文件名改回UTF-8(或它们使用的任何编码)。

注意事项(同样适用于以下解决方案):

  • 进行网址编码后,文件名必须少于255个字符(可能是字节)。
  • UTF-8具有许多字符的多种表示形式(使用组合字符)。如果您不对UTF-8进行标准化,则可能无法搜索glob或重新打开单个文件。
  • 您不能依赖scandir或类似功能进行alpha排序。urldecode然后,您必须使用文件名,然后使用了解UTF-8(和归类)的排序算法。

更糟糕的解决方案

以下是不太吸引人的解决方案,更复杂,并且有更多警告。

在Windows上,PHP文件系统包装程序期望并返回ISO-8859-1字符串作为文件/目录名称。这给您两个选择:

  1. 在文件名中自由使用UTF-8,但要了解,非ASCII字符在PHP外部将 显示为错误 。非ASCII UTF-8字符将存储为多个 单个 ISO-8859-1字符。例如,ó将出现ó在Windows资源管理器中。

  2. 将文件/目录名称限制为ISO-8859-1中可以表示的字符。实际上,您将utf8_decode]在文件系统功能中使用UTF-8字符串之前先传递它们,然后传递条目scandir使您utf8_encode获得UTF-8中的原始文件名。

注意事项!

  • 如果传递给文件系统功能的任何 字节 与ISO-8859-1 中的无效Windows文件系统字符相匹配,则表示您不走运。
  • Windows 可能 在非英语语言环境中使用ISO-8859-1以外的编码。我想它通常是ISO-8859-#之一,但这意味着您需要使用mb_convert_encoding而不是utf8_decode
2020-05-26