Seite 1 von 1

Problem mit Unicode, UTF8, ...

Verfasst: 06.03.2007 22:10
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.

Verfasst: 09.03.2007 12:25
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.

Verfasst: 09.03.2007 13:08
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

Verfasst: 09.03.2007 16:39
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: