ugrás a tartalomhoz

könyvtár/file átnevezés speciális karakter esetén

Theo76 · 2014. Szep. 14. (V), 13.21
Sziasztok!
Egy olyan gondom van, hogy könyvtárat, illetve file-t kellene átneveznem php-vel, viszont ha speciális karaktert talál akkor, nem nevezi át... Próbáltam iconv-al átkonvertálni a file-nevet, de semmi eredmény...
Csináltam debugot, a script szépen kiszedi illetve átalakítja a spec karaktereket, de mikor átnevezésre kerülne a sor, nem történik semmi. A logban csak annyi van, hogy: warning: rename(xx,yy) z.php. A rendszer felépítése: Windows 8.1 64bit, apache 2.4.10 64bit, illetve php 5.6.0 64bit (charset: utf-8)
Pl a karakterek, amikkel nem kezd semmit: ÷פ`

Köszi a segítséget!
 
1

UTF16

Hidvégi Gábor · 2014. Szep. 14. (V), 14.16
NTFS fájlrendszerben a fájlnevek nem UTF8-cal, hanem UTF16-tal vagy az operációs rendszer nyelvéhez tartozó kódlappal vannak kódolva. Esetleg próbáld ki a $name = mb_convert_encoding($name, 'UTF-16', 'UTF-8'); vagy az iconv megfelelőjét.
2

Sajnos nem jó ez a

Theo76 · 2014. Szep. 14. (V), 15.04
Sajnos nem jó ez a megoldás... iconv()-vel már próbálkoztam... gyönyörűen átalakítja, ha echo-val ki íratom, akkor látszik is, hogy a régi file-nevet átalakítja az újra, viszont mihelyt a rename() utasítás jön annyi, nem csinál semmit, és a logban ott a warning...
3

Kód

Hidvégi Gábor · 2014. Szep. 14. (V), 18.00
Be tudnád illeszteni a kérdéses kódrészletet? Nem teljesen értem, mit konvertálgatsz.
5

Kód részlet

Theo76 · 2014. Szep. 14. (V), 18.32
$dirIt = new RecursiveDirectoryIterator($checkPath, FilesystemIterator::SKIP_DOTS);
$it = new RecursiveIteratorIterator($dirIt, RecursiveIteratorIterator::SELF_FIRST);

$key = 0;
foreach ($it as $file) {
    if ($file->isDir()) {
...
        $file[$key]['oldName'] = mb_convert_encoding($file->getFileName(), "UTF-16", "UTF-8");
        $file[$key]['newName'] = search::fixFileName($file[$key]['oldName']);
...
    }
}


a fixFileName class kódrésze:

class Search {
    public function fixFileName($path) {
       $ivChar = array("'s","×","&"," ");
       $vChar = array("Is","x","And", ".");
       $pregInv = array("/[^a-zA-Z0-9\/:_| .-]/","/–/","!\s+!","/_{2,}/","/\.{2,}/");
       $pregVal = array("","-",".","_",".");

       $newPath = preg_replace($pregInv, $pregVal, str_replace($ivChar, $vChar, $path));
       $newPath = trim($newPath, ".");
       $newPath = trim($newPath, "-");
       $newPath = trim($newPath, "_");

       if ($path != $newPath) {
           return $newPath;
       } else {
           return FALSE;
       }
    }
}


A karakter cserét lehet hogy tisztábban is meg lehet oldani, de a preg_replace() dolgokkal most kezdtem el foglalkozni. Természetesen a rename()-nál a teljes elérési út meg van adva.
6

A "régi" fájlnevet miért

Hidvégi Gábor · 2014. Szep. 14. (V), 18.43
A "régi" fájlnevet miért konvertálod? Lehet, hogy amiatt nem találja.
7

hm...

Theo76 · 2014. Szep. 14. (V), 19.48
elírtam... valamit, csak nem tudom törölni a bejegyzést... Még kísérletezem valamivel
8

Ha nem konvertálom át, akkor

Theo76 · 2014. Szep. 14. (V), 20.02
Ha nem konvertálom át, akkor a spec karakterek helyén kérdő jel lesz, és szintén az az eredmény
10

Azt értem, hogy a kiíráshoz

Hidvégi Gábor · 2014. Szep. 15. (H), 09.13
Azt értem, hogy a kiíráshoz konvertálsz, de az átnevezéshez nem kell szerintem.
11

igen... ezt ki is szedtem...

Theo76 · 2014. Szep. 15. (H), 17.37
igen... ezt ki is szedtem... szóval már csak a kiíráshoz alakítom át, de sajnos mégsem nevezi át továbbra sem... Egyébként az utf16 nem jött be... valamiért ha erről kódoltam a kapott neveket, akkor megkétszereződött a karakterek száma... ha pl a $filename= "abcd" karakterből állt, akkor a var_dump($filename) string(8) "abcd" eredményt adta. A cp1252, viszont már jól adta vissza
12

utf16

Poetro · 2014. Szep. 15. (H), 18.00
Mert az UTF-16 két byte-on tárol minden karaktert. Ezért lesz kétszer akkora a hossza.
4

Windows-1252

T.G · 2014. Szep. 14. (V), 18.20
Egy próbát megér: http://en.wikipedia.org/wiki/Windows-1252
iconv('UTF-8', 'CP1252', '...');
9

próbáltam már ezt is... de

Theo76 · 2014. Szep. 14. (V), 20.02
próbáltam már ezt is... de semmi...
13

cp 125?

Vilmos · 2014. Szep. 16. (K), 09.16
Gondolom, a gépeden magyar windows van.
Úgy tudom, a karakterkészlet 1250 és nem 1252.
Miért az utóbbira konvertálsz?
14

nah igen... igaz..

Theo76 · 2014. Szep. 16. (K), 10.44
nah igen... igaz.. elfeljtettem, hogy a windows alatt nyelvenkénti kódlap van... mondjuk nem értem miért nem lehet utf8... Megpróbálom úgy is