[halb GELÖST] Richtige Darstellung von Ascii NFOs u. ä ö ü?

Anfängerfragen zum Programmieren mit PureBasic.
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

Re: [GELÖST / SOLVED] Richtige Darstellung von Ascii art NFO

Beitrag von matbal »

udg hat geschrieben: Ich habe versucht das ganze bei mir einzubinden. Leider bekomme ich nur Fehler, da ich an irgend einer Stelle was nicht richtig setze. wärst Du so nett die mit meinem Beispiel Code einmal zu verbinden?
udg hat geschrieben: Leider habe ich keine Ahnung woran dies nun wieder liegen könnte. Beide Viewer zeigen NFOs richtig an. Nur der eine will meine erstellten nicht ordnungsgemäß wiedergeben. (DamnNFOViewer)
Meine Prozedur oben konvertiert ASCII-Zeichen der CP850 in Unicode-Zeichen. Das selbe macht Windows, wenn du mit STRG-V den Inhalt einer NFO einfügst. Das heißt, im Editor liegt der Text als Unicode vor.

Speicherst du den Text einfach so, so erhältst du eine UTF8-kodierte Text-Datei, allerdings ohne BOM. Die Programme, die das richtig anzeigen, die raten einfach.

Möchtest du eine normale NFO Datei mit CP850 speichern, müssen die Unicode-Zeichen erst wieder zurückgetauscht werden. Ich habe dazu eine zweite Prozedur geschrieben. Vermutlich könnte man die Konvertierungen auch der API des Betriebssystems überlassen, aber ich kenne mich da nicht aus.

Code: Alles auswählen

;===============================================================================================
; NFO VIEWER RAW VERSION for ASCII / ANSI SCENE ART NFO FILES
; PUREBASIC v5.3
;
; UDG in MAY 2015
; feel free to use
; REMEMBER: SET IN COMPILER AS FOLLOW: CHECK Box - Create unicode executable
;
; Thats it.
;
; see Pic. 
;===============================================================================================
EnableExplicit
Global Btn_Nfo

Enumeration
   #Window_0
EndEnumeration

Enumeration
   #Text_Nfo
   #Font_btnRemove_NFO
   #btnRemove_NFO 
   #Editor_Nfo
   #Nfo
   #Font_Editor_Nfo
   #Font_Editor_Nfo_NFO
   #Frame3D_mid
   #Frame3D_big
   #Button_Save
   #Button_Load
EndEnumeration
;}

Structure CharField
   c.c[0]
EndStructure

Procedure.s CP850ToUni(String$)
   ; Ersetzt die oberen ASCII-Zeichen der CP850 durch Unicode-Zeichen 
   Protected *c.character = @String$
   Protected *t.CharField = ?TableCP850
   
   ; String zeichenweise durchgehen und CP850-Werte durch Unicode-Werte ersetzen
   While *c\c
      If *c\c >= 128
         *c\c = *t\c[*c\c-128]
      EndIf
      *c + SizeOf(character)
   Wend
   
   ProcedureReturn String$
   
EndProcedure

Procedure.s UniToCP850(string$)
   ; Ersetzt Unicode-Zeichen durch ASCII-Zeichen der CP850
   Dim Rep.c($ffff)                       
   Protected *t.charField = ?TableCP850
   Protected i
   
   ; zuerst Rückwärts-Ersetztabelle aufbauen
   For i = 128 To 255
      Rep(*t\c[i-128]) = i
   Next i
   
   ; String zeichenweise durchgehen und Unicode-Werte durch CP850-Werte ersetzen
   Protected *c.character = @String$
   While *c\c
      If *c\c >= 128
         If Rep(*c\c)
            *c\c = Rep(*c\c)
         Else
            Debug "Zeichen nicht in CodePage 850 verfügbar:" + Chr(*c\c)
            *c\c = ' '            ; Ersatz für nicht abbildbare Zeichen
         EndIf
         
      EndIf
      *c + SizeOf(character)
   Wend
   
   ProcedureReturn String$
   
EndProcedure

DataSection
   TableCP850:
   TableCP850c:
   Data.s "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈıÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýݯ´­±‗¾¶§÷¸°¨·¹³²■ "   
EndDataSection



Define.l Event, EventWindow, EventGadget, EventType, EventMenu, hWnd, save, cur1, Eingabetext1$, File$, cursorpos.POINT, fmt, Text$

hWnd = OpenWindow(#Window_0, 398, 8, 710, 766, "NFO MAKER-VIEWER", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
; Eigener Cursor
SetClassLong_(Btn_Nfo, #GCL_HCURSOR, 0)
SetClassLong_(save, #GCL_HCURSOR, 0)
; Cursor laden
cur1 = LoadCursor_(0, #IDC_HAND)
;===============================================================================================
;- NFO FIELD
;===============================================================================================
TextGadget(#Text_Nfo, 47, 100, 30, 15, "NFO:") ;x;y;länge;höhe
Btn_Nfo = ButtonGadget(#btnRemove_NFO,45,650,120,50,"Clear NFO") ; Button: Lösche Inhalt in NFO Feld / BTN del Content in EditorGadget 
SetGadgetFont(#btnRemove_NFO, LoadFont(#Font_btnRemove_NFO, "Arial", 8, #PB_Font_HighQuality)) ; Button Font
EditorGadget(#Editor_Nfo, 45, 120, 620, 500,#PB_Editor_WordWrap)                               ;x;y;länge;höhe;Zeilenumbruch am Ende 
SetGadgetFont(#Editor_Nfo, LoadFont(#Font_Editor_Nfo_NFO, "Consolas", 10, #PB_Font_HighQuality)) ; Button Font
save = ButtonGadget(#Button_Save, 545, 650, 120, 50, "speicher NFO")
ButtonGadget(#Button_Load, 405, 650, 120, 50, "lade NFO")
;===============================================================================================

FrameGadget(#Frame3D_mid, 35, 80, 640, 630, "NFO einfügen mit [STRG+V]")
FrameGadget(#Frame3D_big, 10, 10, 690, 740, "Info Viewer")

;===============================================================================================
;
;- HAUPTSCHLEIFE / MAIN
;
;===============================================================================================   
Repeat
   Event = WaitWindowEvent()
   Gosub changecursor
   ;===============================================================================================
   ;- LESE VARIABELN AUS DEN EINGABEFELDERN / READ VARs FROM EditorGadget FIELD
   ;===============================================================================================   
   Select Event
      Case #PB_Event_Gadget 
         Select EventGadget()
            Case  #Button_Save   ; Speichern
               Eingabetext1$= GetGadgetText(#Editor_Nfo); Eingabe auslesen , read input by EditorGadget Field
              ;===============================================================================================
              ;- DATEI SPEICHERN AUFRUFEN / call save dialog
              ;===============================================================================================   
               File$=SaveFileRequester("SAVE NFO FILE", "C:\bbcode.nfo ", "NFO FILE(*.nfo)|*.nfo", 0)
               
               ;===============================================================================================
               ;- SPEICHERE VARIABELN AUS DEN EINGABEFELD IN EINE *.NFO DATEI / Save VARs from input Field to *.NFO
               ;===============================================================================================   
               ; als ASCII in CP850 speichern
               If CreateFile(1, File$) 
                  Eingabetext1$ = UniToCP850(Eingabetext1$)    ; Text auf CodePage 850 abbilden
                  WriteStringN(1,Eingabetext1$, #PB_Ascii)     ; Eingabe in Datei schreiben , write to file
                  CloseFile(1)                                 ; Gespeicherte Datei schließen  
               EndIf
               
;                ; als UTF8 speichern
;                If CreateFile(1, File$)
;                   WriteStringFormat(1, #PB_UTF8)               ; UTF8 BOM
;                   WriteString(1, Eingabetext1$, #PB_UTF8)      ; Text schreiben
;                   CloseFile(1)
;                EndIf
               
               
            Case #Button_Load    ; NFO laden
               File$ = OpenFileRequester("Load NFO File", "", "NFO File (*.nfo)|*.nfo", 0)
               If ReadFile(1, File$)                           ; Datei einlesen
                  fmt = ReadStringFormat(1)                    ; Dateiformat
                  Text$ = ReadString(1, fmt | #PB_File_IgnoreEOL)    ; Gesamten Text
                  
                  If fmt = #PB_Ascii                           ; Bei ASCII-Dateien 
                     Text$ = CP850ToUni(Text$)                 ; CodePage 850 nach Unicode konvertieren
                  EndIf
                  
                  SetGadgetText(#Editor_Nfo, Text$)
               EndIf   
            Case #btnRemove_NFO     ; Anzeige löschen
               ClearGadgetItems(#Editor_Nfo)
               
         EndSelect
         
         
      Case #PB_Event_CloseWindow
         ;===============================================================================================
         ;-                                PROGRAMM BEENDEN / End 
         ;===============================================================================================   
         EventWindow = EventWindow()
         If EventWindow = #Window_0
            DestroyCursor_(cur1)
            CloseWindow(#Window_0)
            Break
         EndIf
         
   EndSelect
Until Event = #PB_Event_CloseWindow
;
; Ende
;
DestroyCursor_(cur1)
End
;
; SUBROUTINE zum wechseln des MouseCursors / SUB to change Cursor behavior
;
changecursor:
GetCursorPos_(cursorpos.POINT)
MapWindowPoints_(0, hWnd, cursorpos, 1)
Select ChildWindowFromPoint_(hWnd, cursorpos\x | cursorpos\y << 32)
   Case Btn_Nfo   : SetCursor_(cur1) ; Cursor ueber/ over Clear NFO
   Case save   : SetCursor_(cur1)    ; Cursor ueber/ over speicher NFO
EndSelect
Return


Ich habe alle meine Prozeduren und Labels umbenannt, weil es ja die Codepage 850 ist.
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: [GELÖST / SOLVED] Richtige Darstellung von Ascii art NFO

Beitrag von udg »

Das ist sehr nett von dir und vielen Dank :allright:
Funktioiniert nun Bestens

nun habe ich noch ein anderes Problem. Wenn ich längeren Text in das EditorGadget Feld einfüge und dies dann speichere, habe ich keinen Zeilenumbruch. Es wird einfach aller Text in eine Zeile geschrieben :(
Wie kann ich dem Text klarmachen das er umgebrochen wird? Stehe gerade auf dem Schlauch.

Edit
OKAY, Habs abgeändert und funktioniert.

Was noch nicht funktioniert: die Darstellung von "öÖ", "äÄ", "üÜ" (im Tool noch alles i.O.)

und zusätzlich dieses Problem, (der Text wird ab Zeie 2 eingerückt beim speichern),
im Tool noch alles brav am linken Rand, geht dies beim Speichern verloren:

Bild

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!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

Re: [halb GELÖST] Richtige Darstellung von Ascii NFOs u. ä ö

Beitrag von matbal »

Das mit den Umlauten könnte ein Bug im Zusammenhang mit dem Flag #PB_ASCII sein (?). Wenn ich den Text Zeichen für Zeichen lade und speichere, gibt es das Problem mit den Umlauten nicht mehr.

Code: Alles auswählen

;===============================================================================================
; NFO VIEWER RAW VERSION for ASCII / ANSI SCENE ART NFO FILES
; PUREBASIC v5.3
;
; UDG in MAY 2015
; feel free to use
; REMEMBER: SET IN COMPILER AS FOLLOW: CHECK Box - Create unicode executable
;
; Thats it.
;
; see Pic. 
;===============================================================================================
EnableExplicit
Global Btn_Nfo

Enumeration
   #Window_0
EndEnumeration

Enumeration
   #Text_Nfo
   #Font_btnRemove_NFO
   #btnRemove_NFO 
   #Editor_Nfo
   #Nfo
   #Font_Editor_Nfo
   #Font_Editor_Nfo_NFO
   #Frame3D_mid
   #Frame3D_big
   #Button_Save
   #Button_Load
EndEnumeration
;}

Structure CharField
   c.c[0]
EndStructure

Procedure.s CP850ToUni(String$)
   ; Ersetzt die oberen ASCII-Zeichen der CP850 durch Unicode-Zeichen 
   Protected *c.character = @String$
   Protected *t.CharField = ?TableCP850
   
   ; String zeichenweise durchgehen und CP850-Werte durch Unicode-Werte ersetzen
   While *c\c
      If *c\c >= 128
         *c\c = *t\c[*c\c-128]
      EndIf
      *c + SizeOf(character)
   Wend
   
   ProcedureReturn String$
   
EndProcedure

Procedure.s UniToCP850(string$)
   ; Ersetzt Unicode-Zeichen durch ASCII-Zeichen der CP850
   Dim Rep.c($ffff)                       
   Protected *t.charField = ?TableCP850
   Protected i
   
   ; zuerst Rückwärts-Ersetztabelle aufbauen
   For i = 128 To 255
      Rep(*t\c[i-128]) = i
   Next i
   
   ; String zeichenweise durchgehen und Unicode-Werte durch CP850-Werte ersetzen
   Protected *c.character = @String$
   While *c\c
      If *c\c >= 128
         If Rep(*c\c)
            *c\c = Rep(*c\c)
         Else
            Debug "Zeichen nicht in CodePage 850 verfügbar:" + Chr(*c\c)
            *c\c = ' '            ; Ersatz für nicht abbildbare Zeichen
         EndIf
         
      EndIf
      *c + SizeOf(character)
   Wend
   
   ProcedureReturn String$
   
EndProcedure

DataSection
   TableCP850:
   Data.s "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈıÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýݯ´±‗¾¶§÷¸°¨·¹³²■ "   
EndDataSection



Define.l Event, EventWindow, EventGadget, EventType, EventMenu, hWnd, save, cur1, Eingabetext1$, File$, cursorpos.POINT, fmt, Text$, *c.character

hWnd = OpenWindow(#Window_0, 398, 8, 710, 766, "NFO MAKER-VIEWER", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
; Eigener Cursor
SetClassLong_(Btn_Nfo, #GCL_HCURSOR, 0)
SetClassLong_(save, #GCL_HCURSOR, 0)
; Cursor laden
cur1 = LoadCursor_(0, #IDC_HAND)
;===============================================================================================
;- NFO FIELD
;===============================================================================================
TextGadget(#Text_Nfo, 47, 100, 30, 15, "NFO:") ;x;y;länge;höhe
Btn_Nfo = ButtonGadget(#btnRemove_NFO,45,650,120,50,"Clear NFO") ; Button: Lösche Inhalt in NFO Feld / BTN del Content in EditorGadget 
SetGadgetFont(#btnRemove_NFO, LoadFont(#Font_btnRemove_NFO, "Arial", 8, #PB_Font_HighQuality)) ; Button Font
EditorGadget(#Editor_Nfo, 45, 120, 620, 500,#PB_Editor_WordWrap)                               ;x;y;länge;höhe;Zeilenumbruch am Ende 
SetGadgetFont(#Editor_Nfo, LoadFont(#Font_Editor_Nfo_NFO, "Consolas", 10, #PB_Font_HighQuality)) ; Button Font
save = ButtonGadget(#Button_Save, 545, 650, 120, 50, "speicher NFO")
ButtonGadget(#Button_Load, 405, 650, 120, 50, "lade NFO")
;===============================================================================================

FrameGadget(#Frame3D_mid, 35, 80, 640, 630, "NFO einfügen mit [STRG+V]")
FrameGadget(#Frame3D_big, 10, 10, 690, 740, "Info Viewer")

;===============================================================================================
;
;- HAUPTSCHLEIFE / MAIN
;
;===============================================================================================   
Repeat
   Event = WaitWindowEvent()
   Gosub changecursor
   ;===============================================================================================
   ;- LESE VARIABELN AUS DEN EINGABEFELDERN / READ VARs FROM EditorGadget FIELD
   ;===============================================================================================   
   Select Event
      Case #PB_Event_Gadget 
         Select EventGadget()
            Case  #Button_Save   ; Speichern
               Eingabetext1$= GetGadgetText(#Editor_Nfo); Eingabe auslesen , read input by EditorGadget Field
              ;===============================================================================================
              ;- DATEI SPEICHERN AUFRUFEN / call save dialog
              ;===============================================================================================   
               File$=SaveFileRequester("SAVE NFO FILE", "C:\bbcode.nfo ", "NFO FILE(*.nfo)|*.nfo", 0)
               
               ;===============================================================================================
               ;- SPEICHERE VARIABELN AUS DEN EINGABEFELD IN EINE *.NFO DATEI / Save VARs from input Field to *.NFO
               ;===============================================================================================   
               ; als ASCII in CP850 speichern
               If CreateFile(1, File$) 
                  Eingabetext1$ = UniToCP850(Eingabetext1$)    ; Text auf CodePage 850 abbilden
                  ;WriteStringN(1,Eingabetext1$, #PB_Ascii)     ; Eingabe in Datei schreiben , write to file (Bug???)
                  
                  ; macht eigentlich das gleiche wie die auskommentierte Zeile vorher
                  *c.character = @Eingabetext1$                ; Zeiger auf erstes Text-Zeichen
                  While *c\c                                   ; solange Zeichen da sind
                     WriteAsciiCharacter(1, *c\c)              ; Zeichen schreiben
                     *c + SizeOf(character)                    ; und zum nächsten Zeichen rücken
                  Wend
                  
                  CloseFile(1)                                 ; Gespeicherte Datei schließen  
               EndIf
               
;                ; als UTF8 speichern
;                If CreateFile(1, File$)
;                   WriteStringFormat(1, #PB_UTF8)               ; UTF8 BOM
;                   WriteString(1, Eingabetext1$, #PB_UTF8)      ; Text schreiben
;                   CloseFile(1)
;                EndIf
               
               
            Case #Button_Load    ; NFO laden
               File$ = OpenFileRequester("Load NFO File", "", "NFO File (*.nfo)|*.nfo", 0)
               If ReadFile(1, File$)                           ; Datei einlesen
                  fmt = ReadStringFormat(1)                    ; Dateiformat
                  ;Text$ = ReadString(1, fmt | #PB_File_IgnoreEOL)    ; Gesamten Text
                  
                  If fmt = #PB_Ascii                           ; Bei ASCII-Dateien 
                     
                     Text$ = Space(Lof(1))                     ; 'leeren' String für Text bereitstellen
                     *c.character = @Text$                     ; Zeiger auf String
                     
                     While Not Eof(1)                          ; Solange Dateiende nicht erreicht ist
                        *c\c = ReadAsciiCharacter(1)           ; ein ASCII-Zeichen lesen und in den String schreiben,
                        *c + SizeOf(character)                 ; dann den Zeiger ein Zeichen weiterrücken
                     Wend
                     
                     Text$ = CP850ToUni(Text$)                 ; CodePage 850 nach Unicode konvertieren
                     
                  Else
                     
                     Text$ = ReadString(1, fmt | #PB_File_IgnoreEOL)
                     
                  EndIf
                  
                  SetGadgetText(#Editor_Nfo, Text$)
               EndIf   
            Case #btnRemove_NFO     ; Anzeige löschen
               ClearGadgetItems(#Editor_Nfo)
               
         EndSelect
         
         
      Case #PB_Event_CloseWindow
         ;===============================================================================================
         ;-                                PROGRAMM BEENDEN / End 
         ;===============================================================================================   
         EventWindow = EventWindow()
         If EventWindow = #Window_0
            DestroyCursor_(cur1)
            CloseWindow(#Window_0)
            Break
         EndIf
         
   EndSelect
Until Event = #PB_Event_CloseWindow
;
; Ende
;
DestroyCursor_(cur1)
End
;
; SUBROUTINE zum wechseln des MouseCursors / SUB to change Cursor behavior
;
changecursor:
GetCursorPos_(cursorpos.POINT)
MapWindowPoints_(0, hWnd, cursorpos, 1)
Select ChildWindowFromPoint_(hWnd, cursorpos\x | cursorpos\y << 32)
   Case Btn_Nfo   : SetCursor_(cur1) ; Cursor ueber/ over Clear NFO
   Case save   : SetCursor_(cur1)    ; Cursor ueber/ over speicher NFO
EndSelect
Return
Zuletzt geändert von matbal am 06.06.2015 18:30, insgesamt 1-mal geändert.
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: [halb GELÖST] Richtige Darstellung von Ascii NFOs u. ä ö

Beitrag von udg »

ist es denn möglich, ä ö ü hier, mit zu definieren?

Code: Alles auswählen

  TableCP850:
   Data.s "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈıÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýݯ´±‗¾¶§÷¸°¨·¹³²■ "   
oder ist dies bei CP850 nicht möglich?
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!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

Re: [halb GELÖST] Richtige Darstellung von Ascii NFOs u. ä ö

Beitrag von matbal »

Die Umlaute sind da schon enthalten. In dem String sind die Codes der CP850 von 128 bis 255 bzw. der gleichaussehende Unicode-Ersatz.
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: [halb GELÖST] Richtige Darstellung von Ascii NFOs u. ä ö

Beitrag von udg »

matbal hat geschrieben:Die Umlaute sind da schon enthalten. In dem String sind die Codes der CP850 von 128 bis 255
ah okay. dann ändert sich was beim speichern. (schreiben der nfo)
ich baue mal deine neue Methode ein. Werde später berichten :)

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!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: [halb GELÖST] Richtige Darstellung von Ascii NFOs u. ä ö

Beitrag von udg »

Die Umlaute werden übernommen. Nun besteht nur noch das Problem, dass ab der 2. Zeile die Schrift eingerückt wird. (siehe Bild)

Bild

besser wäre ich Zentriere Text im Dokument. Muss mich belesen.
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!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

Re: [halb GELÖST] Richtige Darstellung von Ascii NFOs u. ä ö

Beitrag von matbal »

Ich habe den Code noch mal etwas umgeschrieben, so daß das Konvertieren der Codepage gleich beim Einlesen bzw. Speichern der Datei geschieht. Das sind ja auch die Stellen, wo es nur gebraucht wird. Und der Code sieht jetzt auch etwas übersichtlicher aus.

An der Funktionsweise habe ich nichts geändert. Die Zeichen werden einzeln eingelesen und in Abhängigkeit ihres Wertes entweder so übernommen (wenn kleiner als 128) oder mit richtig aussehenden Unicode-Zeichen ersetzt (ab Werte von 128). Beim Speichern das gleiche, nur anders herum.

Code: Alles auswählen

;===============================================================================================
; NFO VIEWER RAW VERSION for ASCII / ANSI SCENE ART NFO FILES
; PUREBASIC v5.3
;
; UDG in MAY 2015
; feel free to use
; REMEMBER: SET IN COMPILER AS FOLLOW: CHECK Box - Create unicode executable
;
; Thats it.
;
; see Pic. 
;===============================================================================================
EnableExplicit
Global Btn_Nfo

Enumeration
   #Window_0
EndEnumeration

Enumeration
   #Text_Nfo
   #Font_btnRemove_NFO
   #btnRemove_NFO 
   #Editor_Nfo
   #Nfo
   #Font_Editor_Nfo
   #Font_Editor_Nfo_NFO
   #Frame3D_mid
   #Frame3D_big
   #Button_Save
   #Button_Load
EndEnumeration
;}

Structure CharField
   c.c[0]
EndStructure

Procedure.s ReadNFO(File$, *CodePage)
   ; Liest eine NFO-Datei ein. 
   ; File$ = Dateiname der NFO-Datei
   ; *CodePage = Zeiger auf die Ersatz-Zeichen für die ASCII-Werte 128-255
   
   Protected Text$ 
   Protected *c.character
   Protected a.a
   Protected *t.CharField = *CodePage
   Protected fmt
   
   If ReadFile(1, File$)
      fmt = ReadStringFormat(1)     ; Dateiformat ermitteln
      
      If fmt = #PB_Ascii            ; ASCII?  
         
         Text$ = Space(Lof(1))            ; Stringspeicher für Text
         *c = @Text$                      ; Zeiger auf erstes Zeichen im String
         
         While Not Eof(1)                 ; solange Dateiende nicht erreicht ist
            a = ReadAsciiCharacter(1)     ; ASCII-Zeichen lesen
            
            If a < 128                    ; 
               *c\c = a                   ; kleine Zeichen übernehmen
            Else
               *c\c = *t\c[a-128]         ; größere Zeichen ersetzen
            EndIf
            
            *c + SizeOf(character)
         Wend
         
      Else                          ; Unicode oder UTF8? 
         Text$ = ReadString(1, fmt | #PB_File_IgnoreEOL)    ; Text einfach laden
         
      EndIf
      
      CloseFile(1)
   EndIf
   
   ProcedureReturn Text$         
         
EndProcedure

Procedure WriteNFO(File$, Text$, *CodePage)
   ; Speichert eine NFO-Datei 
   ; File$ = Dateiname der NFO-Datei
   ; Text$ = zu speichernder Inhalt
   ; *CodePage = Zeiger auf die Ersatz-Zeichen für die ASCII-Werte 128-255
   
   If Text$ = "" : ProcedureReturn : EndIf      ; Abbrechen, wenn kein Text da ist
   
   ; zuerst Rückwärts-Ersetztabelle aufbauen
   Dim Rep.a($ffff)                       
   Protected *t.charField = *CodePage
   Protected i
   Protected error = 0
   
   For i = 128 To 255
      Rep(*t\c[i-128]) = i
   Next i
   
   ; Datei schreiben
   If CreateFile(1, File$)
      Protected *c.character = @Text$              ; Zeiger auf erstes Zeichen
      
      While *c\c                                   ; solange Zeichen da sind
         
         If *c\c < 128                             ; kleine Zeichen
            WriteAsciiCharacter(1, *c\c)           ;     speichern
            
         ElseIf Rep(*c\c)                          ; große Zeichen mit CP850-Ersatz
            WriteAsciiCharacter(1, Rep(*c\c))      ;     Ersatz speichern
            
         Else                                      ; große Zeichen ohne CP850-Ersatz
            WriteAsciiCharacter(1, '.')            ;     Punkt speichern
            Debug "Zeichen nicht in CodePage enthalten"
            error = 1
         EndIf
         
         *c + SizeOf(character)
      Wend
      
      CloseFile(1)
   EndIf
   
   ProcedureReturn error
   
EndProcedure


; DataSection
;    CP850:
;    Data.s "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈıÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýݯ´­±‗¾¶§÷¸°¨·¹³²■ "
;    CP437:
;    Data.s "ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ "
; EndDataSection   

DataSection
   CP850:
   Data.q $00E200E900FC00C7, $00E700E500E000E4, $00EF00E800EB00EA, $00C500C400EC00EE, $00F400C600E600C9, $00F900FB00F200F6, $00F800DC00D600FF, $019200D700D800A3
   Data.q $00FA00F300ED00E1, $00BA00AA00D100F1, $00BD00AC00AE00BF, $00BB00AB00A100BC, $2502259325922591, $00C000C200C12524, $25572551256300A9, $251000A500A2255D
   Data.q $251C252C25342514, $00C300E3253C2500, $256625692554255A, $00A4256C25502560, $00CB00CA00D000F0, $00CE00CD013100C8, $2588250C251800CF, $258000CC00A62584
   Data.q $00D200D400DF00D3, $00FE00B500D500F5, $00D900DB00DA00DE, $00B400AF00DD00FD, $00BE201700B100AD, $00B800F700A700B6, $00B900B700A800B0, $00A025A000B200B3   
   Data.c 0
   
   CP437:
   Data.q $00E200E900FC00C7, $00E700E500E000E4, $00EF00E800EB00EA, $00C500C400EC00EE, $00F400C600E600C9, $00F900FB00F200F6, $00A200DC00D600FF, $019220A700A500A3
   Data.q $00FA00F300ED00E1, $00BA00AA00D100F1, $00BD00AC231000BF, $00BB00AB00A100BC, $2502259325922591, $2556256225612524, $2557255125632555, $2510255B255C255D
   Data.q $251C252C25342514, $255F255E253C2500, $256625692554255A, $2567256C25502560, $2559256525642568, $256B255325522558, $2588250C2518256A, $25802590258C2584
   Data.q $03C0039300DF03B1, $03C400B503C303A3, $03B403A9039803A6, $222903B503C6221E, $2264226500B12261, $224800F723212320, $221A00B7221900B0, $00A025A000B2207F
   Data.c 0
EndDataSection


Define.l Event, EventWindow, EventGadget, EventType, EventMenu, hWnd, save, cur1, Eingabetext1$, File$, cursorpos.POINT, Text$

hWnd = OpenWindow(#Window_0, 398, 8, 710, 766, "NFO MAKER-VIEWER", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
; Eigener Cursor
SetClassLong_(Btn_Nfo, #GCL_HCURSOR, 0)
SetClassLong_(save, #GCL_HCURSOR, 0)
; Cursor laden
cur1 = LoadCursor_(0, #IDC_HAND)
;===============================================================================================
;- NFO FIELD
;===============================================================================================
TextGadget(#Text_Nfo, 47, 100, 30, 15, "NFO:") ;x;y;länge;höhe
Btn_Nfo = ButtonGadget(#btnRemove_NFO,45,650,120,50,"Clear NFO") ; Button: Lösche Inhalt in NFO Feld / BTN del Content in EditorGadget 
SetGadgetFont(#btnRemove_NFO, LoadFont(#Font_btnRemove_NFO, "Arial", 8, #PB_Font_HighQuality)) ; Button Font
EditorGadget(#Editor_Nfo, 45, 120, 620, 500,#PB_Editor_WordWrap)                               ;x;y;länge;höhe;Zeilenumbruch am Ende 
SetGadgetFont(#Editor_Nfo, LoadFont(#Font_Editor_Nfo_NFO, "Consolas", 10, #PB_Font_HighQuality)) ; Button Font
save = ButtonGadget(#Button_Save, 545, 650, 120, 50, "speicher NFO")
ButtonGadget(#Button_Load, 405, 650, 120, 50, "lade NFO")
;===============================================================================================

FrameGadget(#Frame3D_mid, 35, 80, 640, 630, "NFO einfügen mit [STRG+V]")
FrameGadget(#Frame3D_big, 10, 10, 690, 740, "Info Viewer")

;===============================================================================================
;
;- HAUPTSCHLEIFE / MAIN
;
;===============================================================================================   
Repeat
   Event = WaitWindowEvent()
   Gosub changecursor
   ;===============================================================================================
   ;- LESE VARIABELN AUS DEN EINGABEFELDERN / READ VARs FROM EditorGadget FIELD
   ;===============================================================================================   
   Select Event
      Case #PB_Event_Gadget 
         Select EventGadget()
            Case  #Button_Save   ; Speichern
               Eingabetext1$= GetGadgetText(#Editor_Nfo); Eingabe auslesen , read input by EditorGadget Field
              ;===============================================================================================
              ;- DATEI SPEICHERN AUFRUFEN / call save dialog
              ;===============================================================================================   
               File$=SaveFileRequester("SAVE NFO FILE", "C:\bbcode.nfo ", "NFO FILE(*.nfo)|*.nfo", 0)
               
               ;===============================================================================================
               ;- SPEICHERE VARIABELN AUS DEN EINGABEFELD IN EINE *.NFO DATEI / Save VARs from input Field to *.NFO
               ;===============================================================================================   
               ; als ASCII in CP850 speichern
               
               WriteNFO(File$, Eingabetext1$, ?CP850)
               
            Case #Button_Load    ; NFO laden
               File$ = OpenFileRequester("Load NFO File", "", "NFO File (*.nfo)|*.nfo", 0)
               Text$ = ReadNFO(File$, ?CP850)
               
               If Text$ > ""
                  SetGadgetText(#Editor_Nfo, Text$)
               EndIf
               
            Case #btnRemove_NFO     ; Anzeige löschen
               ClearGadgetItems(#Editor_Nfo)
               
         EndSelect
         
         
      Case #PB_Event_CloseWindow
         ;===============================================================================================
         ;-                                PROGRAMM BEENDEN / End 
         ;===============================================================================================   
         EventWindow = EventWindow()
         If EventWindow = #Window_0
            DestroyCursor_(cur1)
            CloseWindow(#Window_0)
            Break
         EndIf
         
   EndSelect
Until Event = #PB_Event_CloseWindow
;
; Ende
;
DestroyCursor_(cur1)
End
;
; SUBROUTINE zum wechseln des MouseCursors / SUB to change Cursor behavior
;
changecursor:
GetCursorPos_(cursorpos.POINT)
MapWindowPoints_(0, hWnd, cursorpos, 1)
Select ChildWindowFromPoint_(hWnd, cursorpos\x | cursorpos\y << 32)
   Case Btn_Nfo   : SetCursor_(cur1) ; Cursor ueber/ over Clear NFO
   Case save   : SetCursor_(cur1)    ; Cursor ueber/ over speicher NFO
EndSelect
Return


p.s. Ich habe noch die englische CP437 (=OEM-US) hinzugefügt. In dem NFO-Reader wird er beim Exportieren benutzt.
Zuletzt geändert von matbal am 06.06.2015 23:34, insgesamt 1-mal geändert.
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: [halb GELÖST] Richtige Darstellung von Ascii NFOs u. ä ö

Beitrag von udg »

huuuuu, wirklich sehr smoove :bounce:

nun habe ich jedoch inzwischen mehrere Eingabefelder erstellt.
wie bekomme ich die weiteren Eingabefelder nun ebenfalls in die gespeicherte Datei?
im Moment lautet der Writebefehl so:

WriteNFO(File$, Eingabetext1$, ?TableCP850)

wie bekomme ich nun noch Feld 2 --> Eingabetext2$ und Eingabetext3$, zusätzlich gespeichert?
:praise:
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!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
matbal
Beiträge: 261
Registriert: 30.03.2011 20:53

Re: [halb GELÖST] Richtige Darstellung von Ascii NFOs u. ä ö

Beitrag von matbal »

udg hat geschrieben:wie bekomme ich die weiteren Eingabefelder nun ebenfalls in die gespeicherte Datei?
im Moment lautet der Writebefehl so:

WriteNFO(File$, Eingabetext1$, ?TableCP850)

wie bekomme ich nun noch Feld 2 --> Eingabetext2$ und Eingabetext3$, zusätzlich gespeichert?
:praise:
VG
Wenn das nur zusätzliche Textzeilen sind, kannst du sie zusammenhängen, bevor du die Datei erstellst

Code: Alles auswählen

Eingabetext1$ + #CRLF$ + Eingabetext2$
Fügt einen Zeilenumbruch hinzu und dann den zweiten Text.

Code: Alles auswählen

Eingabetext1$ = Eingabetext2$ + #CRLF$ + Eingabetext1$
Fügt den zweiten Text vorne hinzu.

Ich habe den Code oben noch mal editiert. Der lange String in der DataSection verändert sich, wenn ich ihn hier im Forum einfüge, weil der WebBrowser ein Zeichen davon nicht anzeigt. Deswegen habe ich den String jetzt in Hexadezimale Zahlen umgewandelt.
Zuletzt geändert von matbal am 06.06.2015 23:41, insgesamt 1-mal geändert.
Antworten