【问题标题】:PHP filename encoding conversion issuePHP文件名编码转换问题
【发布时间】:2013-01-28 08:17:56
【问题描述】:

我正在尝试使用 PHP 批量重命名文件夹中的文件。虽然我在重音字符方面遇到问题,但它大部分都在工作。

带有重音字符的文件名示例是ÅRE_GRÖN.JPG

我想将该文件重命名为ARE_GRON.JPG

如果我这样读取文件:

<?php
$path = __DIR__;
$dir_handle = opendir($path);

while ($file = readdir($dir_handle)) {
    echo $file . "\n";
}

closedir($dir_handle);

...页面显示AÌŠRE_GRÖN.JPG

如果我在脚本开头添加header('Content-Type: text/html; charset=UTF-8');,它会显示正确的文件名,但rename() 函数似乎没有任何效果。

这是我尝试过的:

while ($file = readdir($dir_handle)) {
    rename($file, str_replace('Ö', 'O', $file)); # No effect
    rename($file, str_replace('Ö', 'O', $file)); # No effect
}

我哪里出错了?


如果您认为我在工作中使用了错误的工具,请说出来。如果有人知道如何使用 Bash 脚本实现这一点,请告诉我。我没有 Bash 排骨。

【问题讨论】:

  • 你是用windows还是linux?
  • 您的 PHP 脚本是否编码为 UTF-8?
  • 既然他说的是 bash,我猜他指的是 bash(1),这会暗示 Lunix。
  • 这是我能找到的:bugs.php.net/bug.php?id=39660 但是我相信应该已经有一个解决方法,比如使用 PHP 可以使用的编码系统。如果我找到任何东西,我会发布答案。也可以复制到:stackoverflow.com/questions/873853/…
  • 在 cygwin 上很容易成为 Bash,在 Windows 或 FreeBSD 上本机。

标签: php bash


【解决方案1】:

我想出了办法。

我首先在文件名上运行urlencode()。这将转换字符串:

MÖRKGRÅ.JPG

对 URL 友好:

MO%CC%88RKGRA%CC%8A.JPG

然后我在 URL 编码的字符串上运行 str_replace(),在数组中提供针头和干草堆。我只需要几个瑞典语字符,所以我的解决方案如下所示:

<?php

header('Content-Type: text/html; charset=UTF-8');

$path = __DIR__;

$dir_handle = opendir($path);

while ($file = readdir($dir_handle)) {
    $search = array('A%CC%8A', 'A%CC%88', 'O%CC%88');
    $replace = array('A', 'A', 'O');
    rename($file, str_replace($search, $replace, urlencode($file)));
}

closedir($dir_handle);

工作完成:)


我开始意识到这比我预期的更通用。运行另一个脚本,url_encode() 给了我一些稍微不同的输出,但很容易进行相应的更改。

$search = array('%26Aring%3B', '%26Auml%3B', '%26Ouml%3B', '+');
$replace = array('A', 'A', 'O', '_');

【讨论】:

    【解决方案2】:

    如果要替换的字符数量有限,可以使用

    for f in *; do mv "$f" "${f//Ö/O/}" 2> /dev/null; done
    

    在 GNU 上你可以更普遍地使用

    expr=""
    for char in {A..Z}
    do 
        expr+="s/[[=$char=]]/$char/g; "; 
    done; 
    
    for f in *; do 
        mv "$f" "$(sed -e "$expr" <<< "$f")" 2> /dev/null; 
    done
    

    用 ascii A 替换所有类似 A 的重音字符,用于字母表中的每个字符,但不保证 OS X sed。请注意,这具有将所有文件名大写的副作用。

    【讨论】:

    • 嗯.. 我尝试从保存文件的目录中运行第一个脚本,但它似乎没有任何效果。
    • 尝试从文件名中复制粘贴 Ö 字符而不是键入它。 Unicode 有很多完全相同的 Ö 字符。
    猜你喜欢
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    相关资源
    最近更新 更多