Ascii Umlaute

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Ascii Umlaute

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

PB 5.20 Beta 10 | Windows 7
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Ascii Umlaute

Beitrag von Kiffi »

Joel hat geschrieben:Geht das`?
ja, mit ReplaceString().

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Re: Ascii Umlaute

Beitrag 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?
----------------------------------------------------------

PB 5.20 Beta 10 | Windows 7
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Ascii Umlaute

Beitrag 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$)
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Sunny
Beiträge: 290
Registriert: 19.02.2009 06:02

Re: Ascii Umlaute

Beitrag 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$)
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Ascii Umlaute

Beitrag 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. :)
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
TheCube
Beiträge: 169
Registriert: 20.07.2010 23:59
Computerausstattung: Risen 3400G 16MB Win10-64Bit
Wohnort: NRW

Re: Ascii Umlaute

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