Teckenkodningen kan vara ett problem. UTF-8 kontra ISO-8859-1.
Kär du på Linux, som normalt har UTF-8, eller på Windows eller rentav Mac?
9 svar · 944 visningar · startad av axed
Försöker byta namn på en massa filer i en katalog. Vill att om filen innehåller å, ä eller ö så ska det bytas mot a, a eller o. T ex Övrigt.txt ska bli Ovrigt.txt osv.
Använder koden nedan:
$search = array('å', 'ä', 'ö', 'Å', 'Ä', 'Ö');
$replace = array('a', 'a', 'o', 'A', 'A', 'O');
rename($file, str_replace($search, $replace, $file));
Men alla å, ä eller ö ändras till tecknet ". Alltså t ex "vrigt.txt.
Vad kan vara problemet?
Teckenkodningen kan vara ett problem. UTF-8 kontra ISO-8859-1.
Kär du på Linux, som normalt har UTF-8, eller på Windows eller rentav Mac?
Jag kör på Windows. Men servern där sidan ska ligga sen kör med Linux. Nått man måste tänka på då? Har alltså endast testat på en windows-maskin nu.
1. Vad har du för teckenkodning på själva PHP-skriptet? Redan idag kan man ha UTF-8 utan att PHP klagar?
2. Testa följande - förutsatt att du har $file och att det är en textsträng med filens namn:
// Ingen output före denna!
header('Content-type: text/html;charset=iso-8859-1');
// I stället för konvertering - kolla nuvarande värden:
echo "<pre>\n";
var_dump($file);
$utf8file = utf8_encode($file);
var_dump($utf8file);
$isofile = utf8_decode($file);
var_dump($isofile);
För vilken av de tre (om någon) syns det riktiga tecken?
Får följande resultat om jag provar med filen Övrigt.txt
string(10) "Övrigt.txt"
string(11) "Övrigt.txt"
string(9) "?rigt.txt"
OK, du har som standard iso-8859-1 eller den kompatibla (vad gäller åäö) Windows-kodningen.
Låt oss flytta fokus till rename()
Om du bara kör str_replace och pausar efter den operationen med var_dump() så torde du ha rätt namn?
Om så är fallet har vi nog stött på en bugg i rename() men ingen finns rapporterad på bugs.php.net...
str_replace funkar som den ska, använder samma kod på andra ställen och då byts å ä ö till a a o.
Tja, jag vet i vart fall inte svaret på din fråga :-( Det verkar som det är någon lsgas bugg i rename...
Vad händer om du kör copy + unlink?
Någon annan som har en idé?
copy och unlink verkar fungera utan problem. Det är inte hela världen att rename inte funkar, lite irriterande dock. Tack för förslag iaf.
Inga nya idéer direkt...
Jag testade din kod lokalt på min dator (WinXP - PHP5) och fick det att fungera utan problem.
Märkligt...