webForumDet fria alternativet

rename(), å ä ö blir " " " ?

PHP

9 svar · 944 visningar · startad av axed

Medlem sedan nov. 200136 inlägg
Frågan#1

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?

Medlem sedan feb. 2007278 inlägg
#2

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?

Medlem sedan nov. 200136 inlägg
#3

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.

Medlem sedan feb. 2007278 inlägg
#4

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?

Medlem sedan nov. 200136 inlägg
#5

Får följande resultat om jag provar med filen Övrigt.txt

string(10) "Övrigt.txt"
string(11) "Övrigt.txt"
string(9) "?rigt.txt"

Medlem sedan feb. 2007278 inlägg
#6

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...

Medlem sedan nov. 200136 inlägg
#7

str_replace funkar som den ska, använder samma kod på andra ställen och då byts å ä ö till a a o.

Medlem sedan feb. 2007278 inlägg
#8

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é?

Medlem sedan nov. 200136 inlägg
#9

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.

Medlem sedan juli 20023 617 inlägg
#10

Inga nya idéer direkt...
Jag testade din kod lokalt på min dator (WinXP - PHP5) och fick det att fungera utan problem.
Märkligt...

264 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)