Zulässige Zeichen in Strings

Anfängerfragen zum Programmieren mit PureBasic.
Tanaghra
Beiträge: 28
Registriert: 13.05.2017 01:44

Zulässige Zeichen in Strings

Beitrag 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
Windows 7 x64; geposteter Kode bezieht sich (sofern nicht anders angegeben) immer auf das aktuellste PureBasic 64-Bit

Erst wenn man es seiner Schwiegermutter erklären kann, hat man es verstanden.
As gsündeste is oiwei guad essn und dringa und ned grang wern.
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: Zulässige Zeichen in Strings

Beitrag 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"
Benutzeravatar
udg
Beiträge: 560
Registriert: 20.06.2013 23:27

Re: Zulässige Zeichen in Strings

Beitrag 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
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE! TOP. Kauft Eure Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
juergenkulow
Beiträge: 188
Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten

Re: Zulässige Zeichen in Strings

Beitrag 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ß
Bitte stelle Deine Fragen, denn den Erkenntnisapparat einschalten entscheidet über das einzig bekannte Leben im Universum.

Jürgen Kulow Wersten :D_üsseldorf NRW D Europa Erde Sonnensystem Lokale_Flocke Lokale_Blase Orion-Arm
Milchstraße Lokale_Gruppe Virgo-Superhaufen Laniakea Sichtbares_Universum
Antworten