ExamineDirectory und Umlaute

MAC OSX spezifisches Forum
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
IB-Software
Beiträge: 57
Registriert: 29.08.2004 11:05
Computerausstattung: Windows 11
Wohnort: Berlin
Kontaktdaten:

ExamineDirectory und Umlaute

Beitrag 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
PureBasic 5.73/6.04 Beta 2; Windows 11 Pro 64
Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz 3.19 GHz 16GB; NVIDIA GeForce RTX 3060 16GB
Benutzeravatar
Shardik
Beiträge: 738
Registriert: 25.01.2005 12:19

Re: ExamineDirectory und Umlaute

Beitrag 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.
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: ExamineDirectory und Umlaute

Beitrag 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?
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: ExamineDirectory und Umlaute

Beitrag von Nino »

Dass man sich im Jahre 2019 noch mit sowas herumschlagen muss ... kaum zu glauben. :(
Benutzeravatar
Shardik
Beiträge: 738
Registriert: 25.01.2005 12:19

Re: ExamineDirectory und Umlaute

Beitrag 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"...
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: ExamineDirectory und Umlaute

Beitrag 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?
IB-Software
Beiträge: 57
Registriert: 29.08.2004 11:05
Computerausstattung: Windows 11
Wohnort: Berlin
Kontaktdaten:

Re: ExamineDirectory und Umlaute

Beitrag 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
PureBasic 5.73/6.04 Beta 2; Windows 11 Pro 64
Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz 3.19 GHz 16GB; NVIDIA GeForce RTX 3060 16GB
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: ExamineDirectory und Umlaute

Beitrag 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.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: ExamineDirectory und Umlaute

Beitrag 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.
Benutzeravatar
Shardik
Beiträge: 738
Registriert: 25.01.2005 12:19

Re: ExamineDirectory und Umlaute

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