php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 08.12.2011, 19:00  
Neuer Benutzer
 
Registriert seit: 08.12.2011
Beiträge: 4
PHP-Kenntnisse:
Fortgeschritten
dazlious befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] MAC OS X - Umlaute mit rename ersetzen

Hallo liebe Community,

ich habe ein riesen Problem.

Ich lese Dateien mittels opendir und readdir ein Verzeichnis ein.

PHP-Code:
function scan($folder) {
    
   
// Durchsucht den Tagesordner
   
if ($content opendir($folder)) {
        
       
// Solange es etwas zu lesen gibt
       
while (false !== ($file readdir($content))) {

       }
   }

Dort befinden sich jetzt einige Dateien mit Umlauten (ä,ö,ü,ß,Ä,Ö,Ü)

Diese möchte ich per rename ersetzen.

Unter Windows funktioniert das auch ganz einfach:

PHP-Code:
function deleteSpecialChars($folder$file) {
    
// Falls in der Testumgebung (WIN 7), ist die Zeichenkodierung eine andere
// Jetzt die ANSI-Verzeichniskodierung in UTF-8 umwandeln
// Speichert erstmal den Pfad und den Dateinamen
$oldPath "$folder/$file";
$oldFile "$file";

// Zwei Arrays fuer str_replace()
$d1 = array("ä" "ö""ü""ß""Ä""Ö""Ü"" "); 
$d2 = array("ae" "oe""ue""ss""Ae""Oe""Ue""-");
        
// Kodiere in UTF-8 Format
$newFile utf8_encode($oldFile);
        
// Falls ein Umlaut im Dateinamen ist, ersetze diesen
if (strstr($newFile"ä") || strstr($newFile"ö") || strstr($newFile"ü") || strstr($newFile"ß") || strstr($newFile"Ä") || strstr($newFile"Ö") || strstr($newFile"Ü") || strstr($file" ")) {

// Ersetze die Zeichen
$newFile str_replace($d1$d2$newFile);
            
// Konkatiniere den neuen Pfad
$newPath $folder.'/'.$newFile;
            
//Benennt die Datei um und gibt den Pfad zurueck
rename($oldPath$newPath);

Nur unter Mac OS X hat das Script Probleme. Die Abfrage mittels strstr($newFile, "ä") schlägt komplett fehl. Er merkt es einfach nicht.

Ich tippe mal, dass das an der Zeichenkodierung liegt.

Bitte helft mir, ich google schon seit Wochen nach einer Lösung.

Vielen Dank & Grüße

Michael
dazlious ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 08.12.2011, 19:56  
Erfahrener Benutzer
 
Registriert seit: 26.12.2010
Beiträge: 175
PHP-Kenntnisse:
Anfänger
elise befindet sich auf einem aufstrebenden Ast
Standard

so funktioniert es prima:

PHP-Code:
//habe mal deine Funktion nur leicht verändert
function deleteSpecialChars($folder$file) {

    
$oldPath "$folder/$file";
    
$oldFile "$file";

    
$d1 = array("ä" "ö""ü""ß""Ä""Ö""Ü"" "); 
    
$d2 = array("ae" "oe""ue""ss""Ae""Oe""Ue""-");
        
    
    
$newFile str_replace($d1$d2$oldFile);
            
    
$newPath $folder.'/'.$newFile;
    echo 
"hey".$newPath;
            

    
rename($oldPath$newPath);
}
deleteSpecialChars("test""äböbü.php"); 
getestet im XCode mit western iso latin1 Codierung.

Achte auf Schreibrechte!
__________________
OSL♥
elise ist offline   Mit Zitat antworten
Alt 09.12.2011, 00:52  
Neuer Benutzer
 
Registriert seit: 08.12.2011
Beiträge: 4
PHP-Kenntnisse:
Fortgeschritten
dazlious befindet sich auf einem aufstrebenden Ast
Standard

So ist das auch kein Problem, weil du ja jetzt ein ISO-Latin kodierten String an die Funktion übergibst.

Wenn du aber mit readdir eine Datei aus einem Verzeichnis ausliest und den ausgelesenen Dateinamen direkt an die Funktion übergibst, wird er die Umlaute nicht ersetzen, bzw überhaupt finden können mittels strstr().

Unter windows läuft mein script wie gesagt einwandfrei. Nur der Mac macht Probleme.

Geändert von dazlious (09.12.2011 um 01:20 Uhr). Grund: Das Handy war ein wenig unübersichtlich und T9 wollte nicht so wie ich :)
dazlious ist offline   Mit Zitat antworten
Alt 09.12.2011, 01:45  
Erfahrener Benutzer
 
Registriert seit: 19.06.2009
Beiträge: 837
PHP-Kenntnisse:
Fortgeschritten
Jens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nett
Standard

Anmerkung zu Multipostings
http://phpforum.de/forum/showthread.php?t=267016

Gruß Jens
Jens Clasen ist offline   Mit Zitat antworten
Alt 09.12.2011, 21:11  
Erfahrener Benutzer
 
Registriert seit: 26.12.2010
Beiträge: 175
PHP-Kenntnisse:
Anfänger
elise befindet sich auf einem aufstrebenden Ast
Standard

Durchgetestet:

Und hier:
http://www.techques.com/question/1-5...-not,-what-is?
kannst du den Ansatz erkennen.

ein ä wäre: "a\314\210"

Ä with A\314\210
Ö with O\314\210
Ü with U\314\210
ä with a\314\210
ö with o\314\210
ü with u\314\210

Erweitere dein Array um die entsprechenden Alternativen.

Dann funktioniert die Umbennenung einwandfrei.
__________________
OSL♥
elise ist offline   Mit Zitat antworten
Alt 09.12.2011, 21:20  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Das muß dieser Effekt sein, den man auch regelmäßig in Blogs sieht - dass die Umlaute aus Basisvokal und Diaeresis gebildet wird: http://de.wikipedia.org/wiki/Umlaut#Unicode
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 09.12.2011, 23:27  
Erfahrener Benutzer
 
Benutzerbild von fireweasel
 
Registriert seit: 20.03.2010
Beiträge: 474
PHP-Kenntnisse:
Fortgeschritten
fireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblick
fireweasel eine Nachricht über ICQ schicken fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken fireweasel eine Nachricht über Skype™ schicken
Standard

Zitat:
Zitat von dazlious Beitrag anzeigen
...
Unter windows läuft mein script wie gesagt einwandfrei.
Hier kommt der Einwand: Unter Windows läuft dein Script nur korrekt, wenn die Codepage Win-1252 ("ANSI") eingestellt ist. Unter anderen Codepages finden die PHP-Dateisystemfunktion Einträge mit deutschen Umlauten gar nicht erst. Da wären die kombinierenden diakritische Zeichen, auf die du hier gestoßen bist, das geringere Problem. Soweit mir bekannt, werden die unter Windows-Filesystemen aber "weg-normalisiert". MacOS X dagegen scheint Unicode-Codepoints, die solche Zeichen enthalten, zu zerlegen, zumindest wenn ein Dateisystemeintrag erstellt wird. Bei "fremden" Dateisystemen (wie bspw. FAT32) dagegen, wird auch schon mal deren Normalisierungszustand übernommen (hab ich irgendwo gelesen).

Wenn die Internationalization-Erweiterung (und ICU) installiert ist, kannst du den String wieder denormalisieren (zu "fully composed"):

Normalizer::normalize()

Bedenke aber, dass dein rename()-Ansatz noch eine andere Schwachstelle hat: Du könntest unbeabsichtigt existierende Dateien überschreiben, die zufällig den Zielnamen haben. Das kommt sicher selten vor, macht aber dein Script alles andere als "einwandfrei".

Zitat:
Nur der Mac macht Probleme.
Streng genommen macht es MacOS X richtig (die Umwandlung sollte nur konseqent durchgeführt werden): Ein 'ä', das nur aus einem Codepoint besteht, ist ein Anachronismus, der nur aus Gründen der allseits beliebten Abwärtskompatibilität in die Unicode-Tabellen aufgenommen wurde: Damit man hinterher behaupten konnte, dass ISO-Latin-1 eine Teilmenge von Unicode sei.

Geändert von fireweasel (10.12.2011 um 13:28 Uhr). Grund: typos und ergänzungen
fireweasel ist offline   Mit Zitat antworten
Alt 09.12.2011, 23:54  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Zitat:
Ein 'ä', das nur aus einem Codepoint besteht, ist ein Anachronismus
Das hätte ich ja gern noch mal erklärt.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 10.12.2011, 13:18  
Erfahrener Benutzer
 
Benutzerbild von fireweasel
 
Registriert seit: 20.03.2010
Beiträge: 474
PHP-Kenntnisse:
Fortgeschritten
fireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblickfireweasel ist ein Lichtblick
fireweasel eine Nachricht über ICQ schicken fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken fireweasel eine Nachricht über Skype™ schicken
Standard

Zitat:
Zitat von nikosch Beitrag anzeigen
Zitat:
Zitat von wirefeasel;
Ein 'ä', das nur aus einem Codepoint besteht, ist ein Anachronismus
Das hätte ich ja gern noch mal erklärt.
Eventuell hier: http://www.unicode.org/faq/char_combmark.html#13

Anachronismus ist vielleicht ein zu hartes Wort. Eine Altlast, die wir auf ewig (wegen Abwärtskompatibilität) mitschleifen müssen, trifft es besser.

Geändert von fireweasel (11.12.2011 um 11:39 Uhr).
fireweasel ist offline   Mit Zitat antworten
Alt 10.12.2011, 14:34  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.731
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

Hm, heißt das, ich müsste in einem „Eingabe besteht aus Buchstaben“-Test nicht nur auf General Category[1] L prüfen, sondern zusätzlich noch auf M, wenn ich auch „Buchstaben mit Diakritika“ erwischen will, die nur in NFD vorliegen? Ist das ein realistisches Problem?



1: http://www.unicode.org/versions/Unicode6.0.0/ch04.pdf, Tabelle 4-9, Seite 127 (via Wikipedia). L und M fassen etwa in PCRE die Kategorien mit dem entsprechenden Anfangsbuchstaben zusammen (http://www.php.net/manual/en/regexp....ce.unicode.php).
__________________
Blog | Buch | Kaloa
mermshaus ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Umlaute ersetzen in PHPEclipse Hekotec Off-Topic Diskussionen 2 03.03.2011 22:05
[Erledigt] Umlaute ersetzen preg_replace - funktioniert nicht robat PHP Tipps 2010 27 05.04.2010 00:29
[Erledigt] PHPMailer und Umlaute Sirius PHP Tipps 2010 14 30.03.2010 15:14
Umlaute ersetzen? floking PHP Tipps 2010 11 26.02.2010 14:52
PHP Skript - Umlaute ersetzen Rubio PHP Tipps 2010 1 01.02.2010 22:51
Umlaute und MySQL4.1 Datenbanken 2 15.11.2009 15:28
[Erledigt] Leereichen und Umlaute ersetzen thiagojonas PHP Tipps 2009 13 06.07.2009 15:03
[Erledigt] Umlaute ersetzen funktioniert nicht richtig BlackSpirit PHP Tipps 2009 19 20.04.2009 12:04
Umlaute und str_replace MatzeMuc86 PHP Tipps 2008 20 22.10.2008 20:41
Umlaute in Datenbank Eldra PHP Tipps 2008 3 14.05.2008 07:11
geschachtelten array sortieren, enter ersetzen und umlaute moose PHP Tipps 2006 5 20.04.2006 12:24
Umlaute in Texte ersetzen! wiegia086 PHP Tipps 2006 2 20.04.2006 08:58
Umlaute suchen und ersetzen NetLook PHP Tipps 2006 6 18.04.2006 16:49
Umlaute automatisch ersetzen PHP Tipps 2005 5 31.03.2005 17:34
Reguläre Ausdrücke beim suchen und ersetzen Off-Topic Diskussionen 5 05.07.2004 15:35

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
mermshaus rubio, os x tool zum umlaute ändern, mac php datei umlaute, fireweasel mermshaus, umlaute mac ersetzen, php script bildnamen umbennen sonderzeichen ersetzen, script umlaut normalization, osx sonderzeichen im pfad, buchstaben ersetzen mac os x, umlaute dateien ersetzen mas, os x ordner umlaute, macosx rename umlaute, umlaute mac aendern, umlaute in ordnernamen ersetzen os x, rename ? ersetzen, rename umlaute, mac umlaute ersetzen, umlaute mac entfernen, php rename in schleife nur umlaute ändern, mac benutzernamen umlaut

Alle Zeitangaben in WEZ +2. Es ist jetzt 22:45 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum