Seite 1 von 1

Ascii Umlaute

Verfasst: 13.10.2012 13:55
von Joel
Hey,

über folgenden Code lese ich eine Datei:

Code: Alles auswählen

OpenFile(1, "C:\users\joel\desktop\test.txt")
string$ = ReadString(1, #PB_Ascii)
Debug string$
der Inhalt der Datei in folgender:

Code: Alles auswählen

Caption = 'test1, test2, St'#228'rke'
Das Problem ist ich würde gerne das Format umwandeln, sodass statt '#228' ein ä angezeigt wird. Geht das`?

Gruß Joel

Re: Ascii Umlaute

Verfasst: 13.10.2012 15:15
von Kiffi
Joel hat geschrieben:Geht das`?
ja, mit ReplaceString().

Grüße ... Kiffi

Re: Ascii Umlaute

Verfasst: 14.10.2012 12:50
von Joel
Ist aber sehr Umständlich das alles so zu schreiben das alle Sonderzeichen replaced werden. Hat da evtl jemand schon eine Lib oder einen Code geschrieben?

Re: Ascii Umlaute

Verfasst: 14.10.2012 13:21
von Danilo

Code: Alles auswählen

Procedure.s ReplaceAsciiNum(s.s)
    Protected *p.Character = @s               ; *p = Pointer zum String s.s
    Protected retString.s, num.s
    While *p\c
        If *p\c = 39                          ; ' gefunden
            *p + SizeOf(Character)
            If *p\c = '#'                     ; '# gefunden
                *p + SizeOf(Character)
                num.s = ""
                While *p\c And *p\c <> 39     ; zahl lesen bis wieder ' gefunden
                    If *p\c >= '0' And *p\c <= '9'
                        num + Chr(*p\c)
                    Else
                        ; illegal input error, keine zahl
                    EndIf
                    *p + SizeOf(Character)
                Wend
                If *p\c = 39
                    *p + SizeOf(Character)    ; ' nach zahl entfernen
                EndIf
                retString + Chr(Val(num))     ; ASCII-Zahl an retString anhängen
                Continue
            Else                              ; '...
                retString + Chr(39)
                Continue
            EndIf
        Else
            retString + Chr(*p\c)             ; andere chars einfach an retString anhängen
        EndIf
        *p + SizeOf(Character)
    Wend
    ProcedureReturn retString
EndProcedure

string$ = "Caption = 'test1, test2, St'#228'rke'"; ReadString(1, #PB_Ascii)
Debug string$
Debug ReplaceAsciiNum(string$)

Re: Ascii Umlaute

Verfasst: 14.10.2012 15:05
von Sunny
Ähm... kann sein das ich was wichtiges übersehe aber so macht es sich doch viel leichter oder?

Code: Alles auswählen

Procedure.s MyReplace(String$)
  For i = 1 To 255
    String$ = ReplaceString(String$, "'#" + Str(i) + "'", Chr(i))
  Next
  
  ProcedureReturn String$
EndProcedure

string$ = "Caption = 'test1, test2, St'#228'rke'"

Debug string$
Debug MyReplace(string$)

Re: Ascii Umlaute

Verfasst: 14.10.2012 15:29
von Danilo
Sunny hat geschrieben:Ähm... kann sein das ich was wichtiges übersehe aber so macht es sich doch viel leichter oder?

Code: Alles auswählen

Procedure.s MyReplace(String$)
  For i = 1 To 255
    String$ = ReplaceString(String$, "'#" + Str(i) + "'", Chr(i))
  Next
  
  ProcedureReturn String$
EndProcedure

string$ = "Caption = 'test1, test2, St'#228'rke'"

Debug string$
Debug MyReplace(string$)
Ja, das könnte für Anfänger eventuell leichter zu verstehen sein.

Bei meinem Code wird der String einmal durchgegangen und die Zahlen ersetzt,
bei Deinem Code wird jeder String 255-mal nach allen möglichen Zahlen-Strings durchsucht.

So kann sich Joel nun aussuchen was ihm lieber ist und was er versteht. :)

Re: Ascii Umlaute

Verfasst: 14.10.2012 22:06
von TheCube
Was meint ihr denn zu dieser Variation (ohne pöse Pointer), aber auch ohne 255-faches durchorgeln des Teststrings:

Code: Alles auswählen

Procedure.s ReplaceAsciiNum_(s.s)
    Protected num.s, z.s, l.b, FoundPosS.l, FoundPosE.l
    Repeat
     FoundPosS+1 
     FoundPosS = FindString(s, Chr(39)+ "#", FoundPosS)   ; '# als Startmarkierung suchen
     FoundPosE = FindString(s, Chr(39), FoundPosS+2)      ; '  als Endemarkierung  suchen
     num.s = Mid(s, FoundPosS+2, FoundPosE-FoundPosS-2)   ; nur ASCII-Zahl holen ('228')
     l= Len(num)                                          ; Nur 1,2 oder 3 Stellen machen Sinn
     If l>0 And l<4
       z=Chr(Val(num))                                    ; ASCII-Zahl ('228') in ASCII-Zeichen ('ä') wandeln
       s=ReplaceString(s, Mid(s, FoundPosS, FoundPosE-FoundPosS+1), z ,#PB_String_NoCase, FoundPosS) 
     EndIf
    Until FoundPosS=0   
    ProcedureReturn s
EndProcedure

string$ = "Caption = 'test1, test2, St'#228'rke, B'#252'cher'"; ReadString(1, #PB_Ascii)
Debug string$
Debug ReplaceAsciiNum_(string$)
Wenn ich mich nicht vermessen habe mit dem kleinen integrierten Teststring sogar schneller als Danilo´s Idee. (?) :shock: