Aktuelle Zeit: 20.01.2020 12:16

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: ExamineDirectory und Umlaute
BeitragVerfasst: 14.06.2019 10:02 
Offline

Registriert: 29.08.2004 11:05
Wohnort: Berlin
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:
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ExamineDirectory und Umlaute
BeitragVerfasst: 15.06.2019 11:25 
Offline
Benutzeravatar

Registriert: 25.01.2005 12:19
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ExamineDirectory und Umlaute
BeitragVerfasst: 15.06.2019 16:29 
Offline

Registriert: 29.08.2004 13:18
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!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ExamineDirectory und Umlaute
BeitragVerfasst: 15.06.2019 17:12 
Offline

Registriert: 13.05.2010 09:26
Wohnort: Berlin
Dass man sich im Jahre 2019 noch mit sowas herumschlagen muss ... kaum zu glauben. :(

_________________
Dieser Satz ist falsch.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ExamineDirectory und Umlaute
BeitragVerfasst: 15.06.2019 17:48 
Offline
Benutzeravatar

Registriert: 25.01.2005 12:19
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"...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ExamineDirectory und Umlaute
BeitragVerfasst: 15.06.2019 18:43 
Offline
Benutzeravatar

Registriert: 04.08.2009 17:24
Shardik hat geschrieben:
Ergebnis: Nur eine Datei "ä.txt" mit dem Inhalt "PureBasic"...

Und wenn du diese Datei löscht? Taucht dann die andere auf?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ExamineDirectory und Umlaute
BeitragVerfasst: 15.06.2019 18:52 
Offline

Registriert: 29.08.2004 11:05
Wohnort: Berlin
Meine Lösung sieht jetzt so aus:

Code:
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ExamineDirectory und Umlaute
BeitragVerfasst: 15.06.2019 21:16 
Offline

Registriert: 29.08.2004 13:18
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!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ExamineDirectory und Umlaute
BeitragVerfasst: 15.06.2019 22:03 
Offline

Registriert: 13.05.2010 09:26
Wohnort: Berlin
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:
#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.

_________________
Dieser Satz ist falsch.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ExamineDirectory und Umlaute
BeitragVerfasst: 16.06.2019 15:02 
Offline
Benutzeravatar

Registriert: 25.01.2005 12:19
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.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye