2013-02-12 84 views
3

我正在尝试批量重命名PHP文件夹中的文件。虽然我在重音字符方面存在问题,但它大部分都在工作。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

你在Windows或Linux? – hek2mgl 2013-02-12 21:54:39

+0

您的PHP脚本是否编码为UTF-8? – 2013-02-12 21:56:05

+0

既然他说bash,我想他是指bash(1),这将建议Lunix。 – 2013-02-12 21:56:21

回答

1

我想出了如何做到这一点。

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

MÖRKGRÅ.JPG 

到URL友好:

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

我然后跑str_replace()的URL编码的字符串,在阵列提供针和干草堆。我只需要这几个瑞典字符,所以我的解决办法是这样的:

<?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', '_'); 
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 

全部更换A样的重音带有ascii A的字符,用于字母表中的每个字符,但不保证OS X sed。请注意,这会产生大写所有文件名的副作用。

+0

嗯..我试着从保存文件的目录中运行第一个脚本,但它似乎没有任何效果。 – 2013-02-12 22:21:29

+0

'ls'是否正确显示文件? – 2013-02-12 22:23:30

+0

是的,它的确如此。 – 2013-02-12 23:33:20