如何使用 PHP 中的文件系统函数(使用 UTF-8 字符串)?

2023-12-19

我不能使用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 字符串。这给你两个选择:

  1. 在文件名中自由使用 UTF-8,但要了解非 ASCII 字符会显得不正确PHP 之外。非 ASCII UTF-8 字符将存储为多个singleISO-8859-1 字符。例如。ó将显示为ó在 Windows 资源管理器中。

  2. 将文件/目录名称限制为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(使用前将#替换为@)

如何使用 PHP 中的文件系统函数(使用 UTF-8 字符串)? 的相关文章

  • POST 之后在 PHP 中设置 Location 标头时避免 HTTP 302 响应代码

    我需要放一个201 CreatedPOST 请求的响应代码和 Location 标头 但由于某种原因我仍然收到 302 响应 这就是我所拥有的 header HTTP 1 1 201 header Location The new reso
  • 如何使用多个分隔符拆分列表?

    基本上 我想在文本区域中输入文本 然后使用它们 例如 variable1 variable2 variable3 variable1 variable2 variable3 variable1 variable2 variable3 我知道
  • SplFileObject + LimitIterator + 偏移量

    我有两行数据文件 两行仅用于我的示例 实际上 该文件可以包含数百万行 并且我使用 SplFileObject 和 LimitIterator 进行偏移 但这种组合在某些情况下会有奇怪的行为 offset 0 file new SplFile
  • File_get_contents($url): 无法打开流

    我有一个脚本 我使用以下方法读取文件 file get contents urlencode url 我收到此错误 failed to open stream HTTP request failed HTTP 1 0 400 Bad req
  • 从 PHP 中的平面路径数组构建目录树

    所以 标题可能令人困惑 但我不知道如何表达这种数组结构 它肯定是一个树结构 但至于它的创建 这正是我所渴望的 它似乎不遵循典型的递归数组树构建 我正在尝试从平面路径数组创建列目录布局 每个路径都位于其自己的多维数组内 该数组旨在构建 mac
  • Ajax 调用 contentType: 'application/json' 不起作用

    我有一个 ajax 调用 它将表单数据发送到 php 函数 因为我读了很多使用contentType application json 这是最佳实践 我也想尝试一下 但不幸的是 我的脚本在使用时没有返回任何内容 如果我删除它 脚本就会执行它
  • 将 bcrypt 密码哈希从 PHP 迁移到 Python - ValueError:无效的 hashed_pa​​ssword salt

    我有一个 PHP7 应用程序 它可以像这样对用户密码进行哈希处理 hash password hash password PASSWORD BCRYPT 例如 如果我通过test1234为此 我有 2y 10 aazE9OUKZlOQiM6
  • PHP:会话.auto_start

    我在同一台服务器上有两个项目 它们的设置在 session auto start 中冲突 相关post https stackoverflow com questions 1378324 php setting variables in i
  • 奇怪的 500 内部服务器错误(firebug、php、display_errors、ajax)

    在一页上我正在进行多个 AJAX 调用 所有调用均成功返回响应 但最后一个调用 与其他 ajax 调用无关 返回 500 内部服务器错误作为响应代码 如 firebug 所示 但是 尽管存在错误代码 该 AJAX 调用仍会返回正确的内容 令
  • Woocommerce 从 woocommerce_add_to_cart_fragments 传回的错误片段

    我正在创建自定义 WooCommerce 购物车 并且更新购物车商品的数量工作正常 唯一的问题是它不会自动刷新 只有在页面加载后才起作用 我当前的代码使用woocommerce add to cart fragments挂钩并使用传入的 f
  • PHP 下载页面

    这些 PHP 下载页面 例如 somesite com download php id somefile 通常如何工作 我最初想到了一个执行计数器操作的页面 然后简单地将用户重定向到文件 URL 这似乎是其他地方给出的唯一答案 但是我不知道
  • 终端从包含空格的变量传递参数

    在终端中如何将包含空格的字符串作为参数传递 它实际上跳过了空格后面的部分 只取第一个单词 word soccer ball shell exec casperjs test js word word 那么我怎样才能转义空白它只运行这个命令
  • 使用 laravel 5 和 Auth 更新登录的用户帐户设置

    截至今天 我对 Laravel 实际上是任何 PHP 框架 还是个新手 但对 PHP 并不陌生 我创建了我的第一个项目并设法使用预构建的登录Auth系统 我创建了一个新的路线 控制器和模型 名为AccountSettings所以当我去 ac
  • 550 Bad HELO - 主机冒充域名 Laravel

    我正在尝试设置 Laravel 身份验证 包括 密码重置 功能 但当我尝试发送电子邮件时 我偶然发现了一个错误 我得到的错误是 Expected response code 250 but got code 550 with message
  • 如何复制具有 MySQL 中保留的键和其他结构特征的表?

    如何复制保留键和其他结构特征的表 包括主键 外键和索引 这可以通过单个 MySQL 查询来完成吗 我正在使用 create table newtable as select 但此方法会使所有键和索引丢失 无法使用单个查询来从另一个表复制一个
  • 有没有办法通过给出整数值 PHP 来获取月份名称

    您好 我正在使用 PHP 我想传递一个整数值 1 12 并获取相应的月份名称 PHP 中有没有办法做到这一点 或者我必须通过初始化月份名称数组来完成自己的操作 我想做 month name get month name 1 echo mon
  • 无法使用symfony2连接数据库oracle

    我需要的 我需要将oracle数据库与symfony2连接 我已经通过 php m 检查过 oci8 pdo odbc odbc 这是我关注的链接https gist github com johnkary 6481664 https gi
  • 如何使用 symfony 对管理面板中自己的列进行排序?

    M schema yml News columns title type string 50 category id type integer 4 relations Category local category id foreign c
  • Codeigniter,为MySQL创建表和用户

    我想以编程方式使用 CI 创建数据库和用户 到目前为止 我有这 2 个简单的 MySQL 语句 CREATE DATABASE testdb DEFAULT CHARACTER SET utf8 COLLATE utf8 general c
  • 以零开头的字符串/数字的正确格式?

    我正在尝试使用 PHP 创建一个包含电话号码列表的文件 它工作正常 但如果电话号码以零开头 则该数字将从 Excel 文件中删除 有谁知道如何正确设置格式以使其保持不变 Either Set the value explicitly as

随机推荐