Problem mit Unicode, UTF8, ...

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
SimonSimCity
Beiträge: 132
Registriert: 14.01.2007 00:49

Problem mit Unicode, UTF8, ...

Beitrag von SimonSimCity »

Print.pb

Code: Alles auswählen

Structure User ;{
  sName.s{255}
  sPass.s{32}
EndStructure ;}

Global NewList User.User()

OpenConsole()

Define sInput.s, b1.b

Repeat
  sInput = LCase(Input())
  Select sInput
    Case "new"    ;{
      AddElement(User())
      Print("  Name: ")
      User()\sName = Input()
      Debug  User()\sName
      Print("  Passwort: ")
      sInput = Input()
      User()\sPass = MD5Fingerprint(@sInput, Len(sInput)) ;}
    Case "write"  ;{
      Print("  Dateiname (+ Pfad): ") ; user.dat nehmen
      CreateFile(0, Input())
      
      CompilerIf #PB_Compiler_Unicode
        WriteStringFormat(0, #PB_UTF8)
      CompilerEndIf
      
      ForEach User()
        WriteData(0, @User(), SizeOf(User))
      Next User()
      
      CloseFile(0) ;}
    Case "list"   ;{
      Print("                                                                                ")
      If CountList(User())
        Print("  Name                                       | Passwort (als MD5-Hash)          ")
        Print("  -------------------------------------------+----------------------------------")
        ForEach User()
          Print("  "+LSet(User()\sName, 42)+" | "+LSet(User()\sPass, 32)+" ")
        Next
        Print("  -------------------------------------------+----------------------------------")
        Print("  User: "+Str(CountList(User())))
      Else
        PrintN("  Kein User angegeben. User wird mit 'new' erstellt.")
      EndIf
      PrintN("") ;}
    Case "delete" ;{
      b1 = #False
      Print("  User: ")
      sInput = LCase(Input())
      ForEach User()
        If LCase(User()\sName) = sInput
          b1 = #True
          DeleteElement(User(), 1)
          Break
        EndIf
      Next
      If Not b1
        PrintN("  User konnte nicht gefunden werden.")
      Else
        PrintN("  User wurde gel"+Chr(148)+"scht.")
      EndIf ;}
    Case "exit"   ;{
      Break ;}
    Default       ;{
      PrintN("  ")
      PrintN("  new   -> Erstellt neu User in der Liste")
      PrintN("  write -> Schreibt neue User aus der Liste in die angegebene Datei")
      PrintN("  list  -> Listet alle eingegeben User auf")
      PrintN("  exit  -> Beendet das Programm")
      PrintN("  ") ;}
  EndSelect
  Delay(20)
ForEver

End


TEST_IT.pb

Code: Alles auswählen

Enumeration
  #UserList
EndEnumeration

Structure User
  sName.s{255}
  sPass.s{32}
EndStructure

Global NewList User.User()


If OpenFile(#UserList, "user.dat") = #False
  MessageRequester("Information","Konnte Datei nicht öffnen!")
  PrintN("Server-Error 1")
  End
EndIf


Procedure RefreshList(Wert)
  Repeat
    ClearList(User()) 
    FileSeek(#UserList, 0)
    While Eof(#UserList) = 0
      AddElement(User())
      ReadData(#UserList, @User(), SizeOf(User))
    Wend
    user.s=""
    ForEach User()
      user=user+User()\sName+"|"
    Next
    PrintN("RefreshList: "+user)
    Delay(5000)
  ForEver
EndProcedure


Structure Client
  ClientID.l
  sLastMsg.s
EndStructure

Global NewList Client.Client()

OpenConsole()
PrintN("Server-Start")
CreateThread(@RefreshList(), 23)

Repeat
  Delay(10000)
ForEver
PrintN("Server-End")

CloseFile(#UserList)
CloseConsole()
End

Wenn Ihr diese beiden Codebeispiele in dem selben Verzeichnis speichert und zuerst die Print.pb aufruft, einen User anlegt und in die Datei schreibt, sollte wenn ihr das Script TEST_IT.pb in der Console den Name des Users ausgeben.
Dabei gibt es nur Fragezeichen bei mir aus...
Beide Codes werden bei mir als Unicode-Executables erstellt und benutzen als Textkodierung UTF-8 im Quelltext.


Ich wäre für schnelle Hilfe sehr dankbar.
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag von dysti »

Also, bei mir läuft es normal.
Die User die eingebe, erscheinen bei "test_it" auch im Klartext in der Liste.
Ich mußte bloß aufpassen, das beim wegschreiben der Daten in "print" auch user.dat heißt.
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Benutzeravatar
dysti
Beiträge: 656
Registriert: 10.02.2006 18:34
Wohnort: Schlicktown

Beitrag von dysti »

ich vergaß noch etwas Wichtiges.
Meine Compilereinstellung stehen nicht auf Unicode.
Wenn du Unicode benutzen willst, muß du vorher auch die Strings, die du ausgeben willst, umwandeln.
Das geht so:

Code: Alles auswählen

Procedure.s U2A(egabe.s)
Define rgabe.s
  rgabe.s= PeekS(@egabe, -1, #PB_UTF8)
  ProcedureReturn rgabe
EndProcedure


Procedure RefreshList(Wert)
  Repeat
    ClearList(User())
    FileSeek(#UserList, 0)
    While Eof(#UserList) = 0
      AddElement(User())
      ReadData(#UserList, @User(), SizeOf(User))
    Wend
    user.s=""
    ForEach User()
      
      user=user+User()\sName+"|"
    Next
    PrintN("RefreshList: "+ U2A(user)) ; hier die Umwandlung
    Delay(5000)
  ForEver
EndProcedure
PB5 / Spiderbasic / WB14 / Win7 / Win8.1 / Win10 / Debian 9
Benutzeravatar
SimonSimCity
Beiträge: 132
Registriert: 14.01.2007 00:49

Beitrag von SimonSimCity »

Hab das Problem anderweidig lösen können:

Code: Alles auswählen

  Repeat
    ClearList(User()) 
    FileSeek(#UserList, 0)
    While Eof(#UserList) = 0
      AddElement(User())
      answer=""
      For i=100 To 537 ;{
        mem.s=ReadString(#UserList)
        If Len(mem) > 1
          mem=Right(mem, 1)
        EndIf
        answer=answer+mem
      Next ;}
      ;Debug answer
      User()\sName.s=answer
      answer=""
      For q=1 To 100 ;{
        mem.s=ReadString(#UserList)
        If Len(mem) > 1
          mem=Right(mem, 1)
        EndIf
        answer=answer+mem
      Next ;}
      ;Debug answer
      User()\sPass.s=answer
      User()\bStatus.b=0
    Wend
    user.s=""
    ForEach User()
      user= user+User()\sName+"|"
    Next
    PrintN("RefreshList: "+user)
    Delay(5000)
  ForEver
Falls da noch irgendwelche Lücken drin sind, bitte ich euch eine Antwort zu Posten...

:dysti
Ich hab deine Lösung ausprobiert, aber da kommt nur ein ? und das 1. Zeichen des Benutzers raus (aber im Klartext).
Aber trotzdem Danke für die Mühe.
:allright:
Antworten