我正在尝试使用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印章。
答案 0 :(得分: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', '_');
答案 1 :(得分:0)
如果您想要替换有限数量的字符,可以使用
进行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。请注意,这会产生大写所有文件名的副作用。