Seite 1 von 1

Zulässige Zeichen in Strings

Verfasst: 15.02.2018 23:09
von Tanaghra
Hallo,

ich bin gerade dabei, einen eigenen Paßwortgenerator zu schreiben. Teil des Programmfensters sind TextGadgets, in dem die verwendbaren Sonderzeichen angezeigt werden sollen. Dabei wandelt der Form-Designer manche der TextGadgets in seltsame Konstrukte um, was in mir den Verdacht erregt, daß bestimmte Zeichen in Strings nicht zulässig sind. Kein Problem hat der Form-Designer mit den Strings in folgenden beiden TextGadgets:

Code: Alles auswählen

TextGadget(#Bz_CcSz, 160, 288, 70, 18, "!$%&+,-./:\_")
TextGadget(#Bz_SkSz, 160, 308, 70, 18, "!#$%&-.?@_")
Die Zeichen ! # $ % & + - , . ? / : \ _ @ sind also in Strings OK. Sobald aber in einem String ein Gleichheitszeichen auftaucht, wie in

Code: Alles auswählen

TextGadget(#Bz_TkSz, 160, 208, 160, 18, "!#$%&()*+,-./<=>?@[\]_{|}~")
so wandelt der Form Designer den TextGadget-Befehl in folgendes um:

Code: Alles auswählen

TextGadget(#Bz_TkSz, 160, 208, 160, 18, "!#$%&()*+,-./< = TextGadget(#PB_Any, 160, 208, 160, 18, "!#$%&()*+,-./<=>?@[\]_{|}~")
Zusätzlich wird am Anfang der .pbf-Datei, vor den Enumeration-Blöcken, noch folgende Zeile eingefügt:

Code: Alles auswählen

Global TextGadget(#Bz_TkSz, 160, 208, 160, 18, "!#$%&()*+,-./<
Das ist ja ganz offensichtlich ein Bug, da das schließende Anführungszeichen fehlt. In der Hilfe habe ich nur folgende Anmerkungen gefunden:
Literale Strings werden mit Hilfe des " Zeichens deklariert. Escape-Sequenzen werden mittels des ~ Zeichens vor dem literalen String unterstützt. Die erlaubten Escape-Sequenzen sind …
Dann werden die zulässigen Escape-Sequenzen mit inversem Schrägstrich am Anfang angeführt. Wieso im Zitat die Tilde (~) als Einleitungszeichen für Escape-Sequenzen genannt wird, erschließt sich mir nicht ganz.

Lange Rede, kurzer Sinn: Was muß ich machen, wenn ich in einem TextGadget die Zeichenfolge
!#$%&()*+,-./<=>?@[\]_{|}~
anzeigen lassen will?

Vielen Dank

Re: Zulässige Zeichen in Strings

Verfasst: 15.02.2018 23:25
von HeX0R
Das hat nix mit einer Limitierung von Strings zu tun (Du kannst eigentlich jedes Zeichen in einen String pappen, ausser Chr(0)), das ist offensichtlich ein Fehler im Formdesigner.
Also entweder Du bastelst die Fenster "zu Fuß", oder Du setzt im FormDesigner einen leeren String und setzt das später in Deinem Code per SetGadgetText() richtig.

[Edit]:
Das mit der Tilde:
Du kannst entweder umständlich Strings mit Sonderzeichen so machen:

Code: Alles auswählen

a$ = "abc" + #CRLF$ + "def"
oder aber so:

Code: Alles auswählen

a$ = ~"abc\ndef"

Re: Zulässige Zeichen in Strings

Verfasst: 18.02.2018 06:54
von udg
Vielleicht hilft meine Interpretation dir wirtschaften


Bild

Code: Alles auswählen

;
;
; simpler Key Generator
;
; Anzahl der zu generierenden Zeichen eingeben und den Button drücken
;
; PureBasic v5.61
;

EnableExplicit


Enumeration
  #Window
EndEnumeration

Enumeration
  #Str_Anzahl
  #Str_PassOut
  #Btn_Generate
  #Txt_PassOut
  #Txt_AnzZeichen
  #Fnt_SegoeUI10
  #Fnt_SegoeUI14
  #Fnt_SegoeUI18
  #Cnt
  #Cnt2
EndEnumeration

Define.i Event, EventWindow

LoadFont(#Fnt_SegoeUI14, "Segoe Ui", 14, #PB_Font_HighQuality)
LoadFont(#Fnt_SegoeUI18, "Segoe Ui", 18, #PB_Font_HighQuality)
LoadFont(#Fnt_SegoeUI10, "Segoe Ui", 10, #PB_Font_HighQuality)

Procedure Genereate_Pass()
  
  Protected SeedString.s
  Protected SeedLength, RandomString, Anzahl
  Protected RandomisedString.s
  Protected CurrentChar.s
  
  SeedString.s  = #DQUOTE$ + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789`~!@#$%^&*()_-+=[]\{}|;':,./<>?"
  SeedLength    = Len(SeedString.s)
  RandomisedString.s = ""

  Anzahl = Val(GetGadgetText(#Str_Anzahl))

  For RandomString = 1 To Anzahl
    CurrentChar.s = Mid(SeedString, Random(SeedLength), 1)
    RandomisedString.s + CurrentChar.s
  Next 

  SetGadgetText(#Txt_PassOut, RandomisedString.s) ; TextGadget Out

  SetGadgetText(#Str_PassOut, RandomisedString.s) ; StringGadget Out

EndProcedure

Procedure Main()

  OpenWindow(#Window, 0, 0, 728, 382, "KeyGenerator", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_Invisible)
  SetWindowColor(#Window, $FFFFFF)
  
  ButtonGadget(#Btn_Generate, 174, 55, 265, 60, "generiere Passwort")
  SetGadgetFont(#Btn_Generate, FontID(#Fnt_SegoeUI14))
  
  TextGadget(#Txt_AnzZeichen, 449, 55, 105, 18, "Anzahl eingeben" , #SS_CENTER|#SS_CENTERIMAGE)
  SetGadgetColor(#Txt_AnzZeichen, #PB_Gadget_BackColor, RGB(255, 255, 255))
  SetGadgetFont(#Txt_AnzZeichen, FontID(#Fnt_SegoeUI10))
  
  ContainerGadget(#Cnt2, 449, 79, 105, 35, #PB_Container_BorderLess)
    SetGadgetColor(#Cnt2, #PB_Gadget_BackColor, RGB(205, 205, 205))
    StringGadget(#Str_Anzahl, 1, 1, 103, 33, "20" , #SS_CENTER|#PB_String_BorderLess)
    SetGadgetFont(#Str_Anzahl, FontID(#Fnt_SegoeUI18))
  CloseGadgetList()
    
  TextGadget(#Txt_PassOut, 105, 160, 525, 55, "" , #SS_CENTER|#SS_CENTERIMAGE)
  SetGadgetFont(#Txt_PassOut, FontID(#Fnt_SegoeUI14))
    
  ContainerGadget(#Cnt, 105, 240, 525, 35, #PB_Container_BorderLess)
  SetGadgetColor(#Cnt, #PB_Gadget_BackColor, RGB(205, 205, 205))
    StringGadget(#Str_PassOut, 0, 0, 527, 34, "" , #SS_CENTER|#PB_String_BorderLess)
    SetGadgetFont(#Str_PassOut, FontID(#Fnt_SegoeUI14))
  CloseGadgetList()
      
  BindGadgetEvent(#Btn_Generate, @Genereate_Pass())
      
  HideWindow(#Window, #False)
      
EndProcedure

Main()

Repeat
  Event = WaitWindowEvent()
  Select Event
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window
        CloseWindow(#Window)
        Break
      EndIf
  EndSelect
ForEver

VG

Re: Zulässige Zeichen in Strings

Verfasst: 18.02.2018 08:01
von juergenkulow
Hallo Tanaghra,

im UniCode Schriftzeichen Standard gibt es sehr viele Sonderzeichen, ein Teil der Zeichen fehlt leider auf vielen Computern.

Die Zeichen U+0000 bis U+FFFD aus Plane 0:

Gruß