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?
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.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)
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