Linux: Dateinamen mit Umlauten erzeugen

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

BlitzMoritz

Betreff: Linux: Dateinamen mit Umlauten erzeugen

BeitragDo, Aug 21, 2008 20:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Nicht unbekannt sollte das Phänomen sein, dass Dateien, die in den Dateimanagern von MacOS oder Linux zwar mit korrekten Umlauten aufgelistet sind (wie z.B. "grün.png"), sich aufgrund UTF-Codierung jedoch nicht mit einem solchen String aus BM heraus laden lassen.
Folgende Function ermöglicht dies, indem es die fehlerhaften Ascii-Codes jeweils zurückverwandelt:
Code: [AUSKLAPPEN]
Local Filename:String = "Öfter grüßt dämlicher Ärger"
WriteFile(ConvertUnixString(Filename))
If FileType(ConvertUnixString(Filename)) = 1 Then Notify "Datei gefunden"
'--------------------------------------------------------------------------------------------------
Function ConvertUnixString:String(Path:String, Direction:Byte = 0)
   Local Letter:String, Ascii:Int
   Local i:Int, Count:Int = Len(Path)
   If Direction = 0 Then 'Normal => Unix
      For i = 1 To Count
         Letter = Mid(Path,i,1)
         Select Letter
            Case "Ä"
               Path = Left(Path, i-1) + Chr(195) + Chr(132) + Right(Path, Count-i)
               Count = Count + 1
               i = i + 1
            Case "ä"
               Path = Left(Path, i-1) + Chr(195) + Chr(164) + Right(Path, Count-i)
               Count = Count + 1
               i = i + 1
            Case "Ö"
               Path = Left(Path, i-1) + Chr(195) + Chr(150) + Right(Path, Count-i)
               Count = Count + 1
               i = i + 1
            Case "ö"
               Path = Left(Path, i-1) + Chr(195) + Chr(182) + Right(Path, Count-i)
               Count = Count + 1
               i = i + 1
            Case "Ü"
               Path = Left(Path, i-1) + Chr(195) + Chr(156) + Right(Path, Count-i)
               Count = Count + 1
               i = i + 1
            Case "ü"
               Path = Left(Path, i-1) + Chr(195) + Chr(188) + Right(Path, Count-i)
               Count = Count + 1
               i = i + 1
            Case "ß"
               Path = Left(Path, i-1) + Chr(195) + Chr(159) + Right(Path, Count-i)
               Count = Count + 1
               i = i + 1
         End Select
      Next
   Else 'Unix => Normal
      For i = 1 To Count
         Ascii = Asc(Mid(Path,i,1))
         If Ascii = 195 Then
            Ascii = Asc(Mid(Path, i+1, 1))
            Select Ascii
               Case 132
                  Path = Left(Path, i-1) + "Ä" + Right(Path, Count-i)
               Case 164
                  Path = Left(Path, i-1) + "ä" + Right(Path, Count-i)
               Case 150
                  Path = Left(Path, i-1) + "Ö" + Right(Path, Count-i)
               Case 182
                  Path = Left(Path, i-1) + "ö" + Right(Path, Count-i)
               Case 156
                  Path = Left(Path, i-1) + "Ü" + Right(Path, Count-i)
               Case 188
                  Path = Left(Path, i-1) + "ü" + Right(Path, Count-i)
               Case 159
                  Path = Left(Path, i-1) + "ß" + Right(Path, Count-i)
            End Select
            Count = Count - 1
         End If
      Next
   End If
Return Path
End Function

Die Tatsache, dass der obige Speicher- und Ladetest auch ohne die Funktion 'ConvertUnixString()' funktioniert, sollte über zwei Dinge nicht hinwegtäuschen: Erstes würde nach dem Speichern der Dateiname verfälscht angezeigt bzw. anders kodiert (siehe MacOS-Finder bzw. Linux-Dateimanager). Zweitens könnte man, wie bereits erwähnt, eine andere Datei, welche die System-Dateimanager z.B. mit "grün.png" angeben, ohne die Konvertierungsfunktion gar nicht laden.


Edit: Irgendwie ist obiger Code Schrott geworden ... bitte weiterlesen
  • Zuletzt bearbeitet von BlitzMoritz am Do, Jun 09, 2011 21:25, insgesamt einmal bearbeitet

BlitzMoritz

BeitragDo, Jun 09, 2011 21:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Blackgecko hat mich dankenswerter Weise darauf aufmerksam gemacht, dass obiger Code nicht (mehr?) funktioniert bzw. nur noch Schrott liefert. Ich habe keine Ahnung mehr, wie ich auf ihn kam. Darum hier eine Korrektur, damit der Codearchivbeitrag nicht sinnlos wird.
Es geht um Folgendes: Man möchte aus BlitzMax-Code heraus eine Datei erzeugen, dessen Name Umlaute beinhalten, also etwa:
BlitzMax: [AUSKLAPPEN]
WriteFile("Öfter grüßt dämlicher Ärger") 
Auf unseren Linux-Rechnern erscheinen dann im Dateiexplorer Nautilus falsche unleserliche Zeichen, komischer Weise aber nicht auf meinem MacOSX. Mit folgender simpler Funktion lässt sich dieser anscheinend Linux-spezifische Fehler korrigieren:
BlitzMax: [AUSKLAPPEN]
Function Linux_Path$(Path$)
Path = Replace(Path, "Ä", Chr(196))
Path = Replace(Path, "Ö", Chr(214))
Path = Replace(Path, "Ü", Chr(220))
Path = Replace(Path, "ä", Chr(228))
Path = Replace(Path, "ö", Chr(246))
Path = Replace(Path, "ü", Chr(252))
Path = Replace(Path, "ß", Chr(223))
Return Path
End Function
... so dass
BlitzMax: [AUSKLAPPEN]
WriteFile(Linux_Path("Öfter grüßt dämlicher Ärger"))
das gewünschte Ergebnis bringt.
Nicht vergessen: Will man eine solche Datei wieder laden, muss man ebenfalls diese Function benutzen:
BlitzMax: [AUSKLAPPEN]
Local file:TStream = ReadFile(Linux_Path("Öfter grüßt dämlicher Ärger"))

Silver_Knee

BeitragFr, Jun 10, 2011 0:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn es unter Win32 und OSX geht wieso nicht:

BlitzMax: [AUSKLAPPEN]
Function Linux_Path$(Path$)
?Linux
Path = Replace(Path, "Ä", Chr(196))
Path = Replace(Path, "Ö", Chr(214))
Path = Replace(Path, "Ü", Chr(220))
Path = Replace(Path, "ä", Chr(228))
Path = Replace(Path, "ö", Chr(246))
Path = Replace(Path, "ü", Chr(252))
Path = Replace(Path, "ß", Chr(223))
?
Return Path
End Function

Lord Stweccys

BeitragFr, Jun 10, 2011 10:54
Antworten mit Zitat
Benutzer-Profile anzeigen
@Silver_Knee:

Entweder das oder eben

BlitzMax: [AUSKLAPPEN]
?Linux
WriteFile(LinuxPath("Käse"))
?Not Linux
WriteFile("Käse")
?


Das ist vielleicht umständlich, dürfte aber etwas schlankeren Code unter Windows und OS-X erstellen.
  • Zuletzt bearbeitet von Lord Stweccys am Fr, Jun 10, 2011 17:57, insgesamt einmal bearbeitet

Silver_Knee

BeitragFr, Jun 10, 2011 17:36
Antworten mit Zitat
Benutzer-Profile anzeigen
aber um Nuancen schlanker wenn nicht sogar so ne methode wie Function Bla$(lol$):Return lol:End Function wegoptimiert wird.

BladeRunner

Moderator

BeitragFr, Jun 10, 2011 18:03
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzMax: [AUSKLAPPEN]
?linux
Function WriteFile:TStream(url:Object)
If String(url)
Local lurl:String = String(url)
lurl = Replace(lurl, "Ä", Chr(196))
lurl = Replace(lurl, "Ö", Chr(214))
lurl = Replace(lurl, "Ü", Chr(220))
lurl = Replace(lurl, "ä", Chr(228))
lurl = Replace(lurl, "ö", Chr(246))
lurl = Replace(lurl, "ü", Chr(252))
lurl = Replace(lurl , "ß" , Chr(223) )
url = lurl
EndIf
Return BRL.FileSystem.WriteFile(url)
End Function
?
WriteFile("lalü")

Ungetestet, sollte aber so funktionieren. Für Read/Openfile natürlich analog zu verwenden.

blackgecko

BeitragFr, Jun 10, 2011 20:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Eine solche Überschreibung wirkt sich aber nicht auf Befehle aus, die in irgendwelchen Modulen stecken und ihrerseits auf ReadFile o.ä. zurückgreifen (z.B. LoadImage).
So long and thanks for all the fish.
Fedora 17 | Windows 7 || BlitzPlus | BlitzMax
Rechtschreibflame GO!!! Deppenapostroph | SeidSeit | Deppenakzent | DassDas | Deppenleerzeichen | TodTot | enzigste.info - Ja, ich sammel die.

Lord Stweccys

BeitragFr, Jun 10, 2011 21:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Mein jetziges Projekt, der "Optimizer", optimiert kleinere Problemchen und Unnötigkeiten
in den Assemblerdateien, die bcc erzeugt. Ich könnte ihn so weiter entwickeln, dass
er die Linuxumlaute automatisch umändert.

BtbN

BeitragFr, Jun 10, 2011 23:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Hat BMax nicht schon einen Unicode Stream/String Filter dabei, durch den man den String nur jagen muss?

Lord Stweccys

BeitragSa, Jun 11, 2011 10:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe eine Manipulation in dem Stream-Modul vorgenommen, jetzt funktionieren die Umlaute einwandfrei.
Meine erste Überlegung war, die Linuxumlaute durch die Ascii-Umlaute schon in der Assemblerdatei zu ändern,
allerdings werden diese Umlaute nicht mehr korrekt im Terminal ausgegeben.

Um den Umlautebug in der Stream.bmx zu behebnen, müsst ihr folgendes in der Funktion OpenFile des Types
TCStream ändern:

BlitzMax: [AUSKLAPPEN]
Local cstream=fopen_( path,mode )


wird zu

BlitzMax: [AUSKLAPPEN]
?Linux
path=Linux_Path(path)
?
Local cstream=fopen_( path,mode )


und am Ende der Stream.bmx einfach die linuxbedingte Funtkino von BlitzMoritz hinwerfen:

BlitzMax: [AUSKLAPPEN]
?Linux
Function Linux_Path$(Path$)
Path = Replace(Path, "Ä", Chr(196))
Path = Replace(Path, "Ö", Chr(214))
Path = Replace(Path, "Ü", Chr(220))
Path = Replace(Path, "ä", Chr(228))
Path = Replace(Path, "ö", Chr(246))
Path = Replace(Path, "ü", Chr(252))
Path = Replace(Path, "ß", Chr(223))
Return Path
End Function
?



Module rebuilden und es gibt bei Dateinamen-Umlauten keine Probleme mehr.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group