【问题标题】:PHP rename failed for foldername with utf-8 turkish charset string使用 utf-8 土耳其字符集字符串的文件夹名称的 PHP 重命名失败
【发布时间】:2021-12-17 16:21:32
【问题描述】:
<?php

$oldname = 'D:\a\file.zip';
$newName = 'D:\a\öÖçÇ\İ\file.zip';
//$newName = 'D:\a\ooCC\i\file.zip'; it's work

rename($oldname, $newName);

?>

错误:

Warning: rename(D:\a\file.zip,D:\a\öÖçÇ\İ\file.zip): The system cannot find the path specified. (code: 3) in C:\Users\Desktop\rename.php on line 9

我尝试了“url_encode”、“iconv”但没有成功。

【问题讨论】:

  • 确认一下,目录“D:\a\öÖçÇ\İ\”是否已经存在?如果您只是将文件重命名为具有土耳其语字母,而不是将其移动到一个目录中,您是否会遇到同样的问题,例如rename("D:\a\file.zip", "D:\a\file-öÖçÇ-İ.zip");?
  • 是的,文件夹目录存在。我必须使用土耳其语字符。我会把它集成到一个系统中。
  • 一直都是一团糟,但如果我没记错的话,Windows 几乎没有在任何地方使用 UTF-8,更不用说文件系统了,而且 PHP 在最近的版本中只使用正确的 Win32 API。我建议你手动创建一个文件,从 PHP 中读取它的名称,然后bin2hex() 看看它的样子。
  • 你说你“试过 iconv”,你能告诉我们你到底尝试了什么吗?由于 iconv 是一种从一种编码转换为另一种编码的函数,因此只有知道拥有的编码以及想要的编码,才能有效地使用它。
  • Code Page 1252 没有“İ”的编码,因此如果目录以该名称存在,则不能使用该编码。我没有安装 Windows PHP 来测试它,但iconv("UTF-8", "UTF-16", $newNam); 似乎更有可能是猜测(如上所述,许多 Windows API 使用 UTF-16 而不是 UTF-8)。另一种可能是你的PHP源文件不是UTF-8的,所以你需要重新保存或者使用iconv("some other encoding your text editor is using", "UTF-8", $newNam);

标签: php utf-8 file-rename


【解决方案1】:

需要将文件路径编码为 UTF-16 以便 Windows 识别它。由于我的 PHP 源代码是使用编码“UTF-8”保存的,所以我使用了这个:

$oldname = 'D:\a\file.zip';
$newName = 'D:\a\öÖçÇ\İ\file.zip';
$newName = iconv("UTF-8", "UTF-16", $newName);

$copyIslem = copy($oldname, $newName);

【讨论】:

  • 我很高兴你能成功。我添加了一些额外的解释,可能会对这个问题的未来读者有所帮助。
  • 完全荒谬。这里iconv("UTF-8", "UTF-16", $newName); 行完全不可用,因为iconv function 不会更改要转换的字符串(在这种特殊情况下为$newName)。
  • @JosefZ 嗯,我没注意到。可能实际的修复是 $newName = iconv... 但他们在这里复制时出错了?
  • @IMSoP 当然,您可以检查一下自己,echo iconv("UTF-8", "UTF-16", $newName); 完全是胡言乱语……
  • @JosefZ 嗯,它提供了 UTF-16,所以如果你尝试将它显示为 UTF-8,它看起来像乱码;但这不是问题所在。
猜你喜欢
  • 2021-07-21
  • 1970-01-01
  • 1970-01-01
  • 2016-10-09
  • 2014-05-04
  • 1970-01-01
  • 2013-08-22
  • 1970-01-01
  • 2014-04-16
相关资源
最近更新 更多