Linux: Dateinamen mit Umlauten erzeugen
Übersicht

![]() |
BlitzMoritzBetreff: Linux: Dateinamen mit Umlauten erzeugen |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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$)... 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn es unter Win32 und OSX geht wieso nicht:
BlitzMax: [AUSKLAPPEN] Function Linux_Path$(Path$) |
||
![]() |
Lord Stweccys |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Silver_Knee:
Entweder das oder eben BlitzMax: [AUSKLAPPEN] ?Linux 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
aber um Nuancen schlanker wenn nicht sogar so ne methode wie Function Bla$(lol$):Return lol:End Function wegoptimiert wird. | ||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
BlitzMax: [AUSKLAPPEN] ?linux Ungetestet, sollte aber so funktionieren. Für Read/Openfile natürlich analog zu verwenden. |
||
![]() |
blackgecko |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hat BMax nicht schon einen Unicode Stream/String Filter dabei, durch den man den String nur jagen muss? | ||
![]() |
Lord Stweccys |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 und am Ende der Stream.bmx einfach die linuxbedingte Funtkino von BlitzMoritz hinwerfen: BlitzMax: [AUSKLAPPEN] ?Linux Module rebuilden und es gibt bei Dateinamen-Umlauten keine Probleme mehr. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group