3

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スクリプトでこれを達成する方法を知っているなら、私に見せてください。バッシュチョップはありません。

4

2 に答える 2

2

私はそれを行う方法を理解しました。

私は最初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', '_');
于 2013-02-13T00:36:18.533 に答える
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に置き換えますが、OSXsedの保証はありません。これには、すべてのファイル名を大文字にするという副作用があることに注意してください。

于 2013-02-12T22:18:15.930 に答える