2013-02-12 83 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