Seite 1 von 1

ExamineDirectory und Umlaute

Verfasst: 14.06.2019 10:02
von IB-Software
Ich lese ein Verzeichnis ein und möchte dieses mittels FindString filtern.
Sind in den Datei- oder Verzeichnisnamen allerdings Umlaute funktioniert das gar nicht.

Code: Alles auswählen

Directory$ = GetHomeDirectory() + "/test"
If ExamineDirectory(0, Directory$, "*.*")  
  While NextDirectoryEntry(0)
    Debug DirectoryEntryName(0)
    Debug URLEncoder (DirectoryEntryName(0))
    Debug URLEncoder ("ä")
    If FindString(DirectoryEntryName(0),"ä") > 0
      Debug "Hurra"  
    EndIf
  Wend
  FinishDirectory(0)
EndIf
Habe dann mittels URLEncoder versucht festzustellen, wie die Umlaute intern codiert werden.
Bei Umlauten im Quellcode werde diese, wie erwartet, als "%C3%A4" dargestellt.
Bei Umlauten in den ausgelesenen Verzeichnissen als "a%CC%88"
So ist natürlich kein Vergleich möglich.

Unter Windows funktioniert alles wie es soll.

Gibt es eine Lösung?

Danke im Voraus.

Ingo

Re: ExamineDirectory und Umlaute

Verfasst: 15.06.2019 11:25
von Shardik
Ich kann das Problem nachvollziehen und bestätigen: Wenn man eine Datei "ä.txt" mit TextEdit anlegt, funktioniert der Dateinamensvergleich nicht. Lässt man "ä.txt" aber mit PureBasic anlegen, funktioniert der Dateinamensvergleich reibungslos (getestet unter MacOS 10.14.5 'Mojave' mit PB 5.70 x64).

Die Erklärung für dieses Problem zeigt eigentlich schon die Ausgabe von Deinem Programm: das "ä" wird nicht nur anders kodiert im vom TextEdit gespeicherten Dateinamen und in PureBasics Buchstaben "ä", sondern im TextEdit-Dateinamen wird auch noch das "a" bei der Kodierung vorangestellt. Das bedeutet, dass TextEdit bei Dateinamen UTF8-NFD ("Decomposed") verwendet, wo Basisbuchstabe und Diakritika getrennt gespeichert werden, während PureBasic UTF8-NFC ("Composed") verwendet, wo ein Umlaut als ein einzelnes Zeichen abgespeichert wird. Eine ausführliche Erklärung bietet dieser Link.

Re: ExamineDirectory und Umlaute

Verfasst: 15.06.2019 16:29
von GPI
in Finder wird beides gleich angezeigt? Könnte man damit zwei ä.txt anlegen, die eigentlich gleich heißen, aber dank anderer kodierung anders abgelegt sind?

Re: ExamineDirectory und Umlaute

Verfasst: 15.06.2019 17:12
von Nino
Dass man sich im Jahre 2019 noch mit sowas herumschlagen muss ... kaum zu glauben. :(

Re: ExamineDirectory und Umlaute

Verfasst: 15.06.2019 17:48
von Shardik
GPI hat geschrieben:in Finder wird beides gleich angezeigt? Könnte man damit zwei ä.txt anlegen, die eigentlich gleich heißen, aber dank anderer kodierung anders abgelegt sind?
Das ist eine interessante Frage und ich habe es direkt ausprobiert:
- Ich habe mit TextEdit die Datei "ä.txt" angelegt und "TextEdit" hineingeschrieben
- Dann habe ich mit PureBasic im gleichen Verzeichnis mit CreateFile() ebenfalls die Datei "ä.txt" angelegt und "PureBasic" hineingeschrieben.
Ergebnis: Nur eine Datei "ä.txt" mit dem Inhalt "PureBasic"...

Re: ExamineDirectory und Umlaute

Verfasst: 15.06.2019 18:43
von Josh
Shardik hat geschrieben:Ergebnis: Nur eine Datei "ä.txt" mit dem Inhalt "PureBasic"...
Und wenn du diese Datei löscht? Taucht dann die andere auf?

Re: ExamineDirectory und Umlaute

Verfasst: 15.06.2019 18:52
von IB-Software
Meine Lösung sieht jetzt so aus:

Code: Alles auswählen

Procedure.s UmlauteUmCodieren(Text.s)
  
  Text = URLEncoder(Text)
  If CountString(Text, "%CC%88") = 0:ProcedureReturn URLDecoder(Text):EndIf
  
  Text = ReplaceString (Text,"a%CC%88", "%C3%A4") 
  Text = ReplaceString (Text,"A%CC%88", "%C3%84") 
  Text = ReplaceString (Text,"o%CC%88", "%C3%B6") 
  Text = ReplaceString (Text,"O%CC%88", "%C3%96") 
  Text = ReplaceString (Text,"u%CC%88", "%C3%BC") 
  Text = ReplaceString (Text,"U%CC%88", "%C3%9C") 
  
  ProcedureReturn URLDecoder(Text)
    
EndProcedure
Elegant ist anders

Ingo

Re: ExamineDirectory und Umlaute

Verfasst: 15.06.2019 21:16
von GPI
Shardik hat geschrieben:
GPI hat geschrieben:in Finder wird beides gleich angezeigt? Könnte man damit zwei ä.txt anlegen, die eigentlich gleich heißen, aber dank anderer kodierung anders abgelegt sind?
Das ist eine interessante Frage und ich habe es direkt ausprobiert:
- Ich habe mit TextEdit die Datei "ä.txt" angelegt und "TextEdit" hineingeschrieben
- Dann habe ich mit PureBasic im gleichen Verzeichnis mit CreateFile() ebenfalls die Datei "ä.txt" angelegt und "PureBasic" hineingeschrieben.
Ergebnis: Nur eine Datei "ä.txt" mit dem Inhalt "PureBasic"...
DANN klingt das nach einen "BUG" in Purebasic. Bzw. Purebasic sollte bei DirectoryEntryName() eine automatische Umwandlung erfolgen von UTF8(wasauchimmer) zu den unicode-Format der Strings erfolgen. Das so ein "Workaround" nötig ist, zeigt hier einen Bug. Irgendwer sollte in englischen Forum einen Beitrag erstellen.

Edit: Eventuell auch ein Bug bei CreateFile - TextEdit ist doch ein MacOS "System" Programm, oder? wenn ja sollte man sich daran orientieren.

Re: ExamineDirectory und Umlaute

Verfasst: 15.06.2019 22:03
von Nino
IB-Software hat geschrieben:Elegant ist anders
Es geht tatsächlich etwas eleganter. ;-)
Denn der Umweg über URLEncoder()/-Decoder() ist nicht nötig.
Folgendes funktioniert hier (PB 5.71 beta 1 unter Windows 10):

Code: Alles auswählen

#Trema = Chr($0308)

Procedure.s Umcodieren(text$)
   If FindString(text$, #Trema)
      text$ = ReplaceString(text$, "A" + #Trema, "Ä")
      text$ = ReplaceString(text$, "a" + #Trema, "ä")
      text$ = ReplaceString(text$, "O" + #Trema, "Ö")
      text$ = ReplaceString(text$, "o" + #Trema, "ö")
      text$ = ReplaceString(text$, "U" + #Trema, "Ü")
      text$ = ReplaceString(text$, "u" + #Trema, "ü")
   EndIf
   
   ProcedureReturn text$
EndProcedure


; -- Demo
Define s$, t$

s$ = "A" + #Trema + "a" + #Trema +
     "O" + #Trema + "o" + #Trema +
     "U" + #Trema + "u" + #Trema
Debug s$ + " (" + Len(s$) + " Zeichen)"

t$ = Umcodieren(s$)
Debug t$ + " ( " + Len(t$) + " Zeichen)"
Shardik hat geschrieben:Das bedeutet, dass TextEdit bei Dateinamen UTF8-NFD ("Decomposed") verwendet, wo Basisbuchstabe und Diakritika getrennt gespeichert werden, während PureBasic UTF8-NFC ("Composed") verwendet, wo ein Umlaut als ein einzelnes Zeichen abgespeichert wird.
So wie ich den Text unter https://de.wikipedia.org/wiki/Trema verstehe, ist ein Umlaut immer 1 Zeichen, und ein Basisbuchstabe gefolgt von einem Trema ist etwas anderes als ein Umlaut!
Wenn das stimmt, dann sehe ich hier keinen Bug in PureBasics DirectoryEntryName()-Funktion.

Re: ExamineDirectory und Umlaute

Verfasst: 16.06.2019 15:02
von Shardik
Josh hat geschrieben:
Shardik hat geschrieben:Ergebnis: Nur eine Datei "ä.txt" mit dem Inhalt "PureBasic"...
Und wenn du diese Datei löscht? Taucht dann die andere auf?
Nein, anscheinend kann MacOS mit beiden UTF-Varianten umgehen und überschreibt die mit TextEdit zuerst erstellte Datei.