Seite 1 von 2
LoadFont und ttc
Verfasst: 13.12.2008 01:41
von D@nte
Ganz einfach gefragt, wie bekomme ich es hin das PB asiatische Schriftzeichen in einem TextGadget benutzt?
Hintergrund, ich habe einen 128 Byte langen Hex-Wert (hex.s) den ich Byte für Byte auslese und in ein Array speicher, die Ausgebe wollte ich wie unten im Code (hier sehr vereinfacht) machen und mittels LoadFont SimSun.ttc oder Gulim.ttc drüber legen nur statt dem erwarten Kaudawelsch "黄昏圣殿3区单人模式阻挡门" bekomm ich völlig unerwarteten anderen Kaudawlsch "»Æ»èÊ¥µî3Çøµ¥ÈËģʽ×èµ²ÃÅ" der mir aber überhaupt nichts bringt.
Seh ich den Wald vor lauter Bäumen mal wieder nicht, oder was mach ich falsch?!
Code: Alles auswählen
LoadFont (0, "SimSun", 15)
hex.s = "BB C6 BB E8 CA A5 B5 EE 33 C7 F8 B5 A5 C8 CB C4 A3 CA BD D7 E8 B5 B2 C3 C5"
dec.s = "187;198;187;232;202;165;181;238;51;199;248;181;165;200;203;196;163;202;189;215;232;181;178;195;197;"
If OpenWindow(0, 100, 200, 220, 40, "Font Test")
If CreateGadgetList(WindowID(0))
StringGadget(0, 10, 10, 200, 20, "")
EndIf
SetGadgetFont(0, FontID(0))
For i = 1 To 25
SetGadgetText(0, GetGadgetText(0) + Chr(Val(StringField(dec, i, ";"))))
Next i
Repeat
EventID = WaitWindowEvent()
If EventID = #PB_Event_CloseWindow
quit = 1
EndIf
Until quit = 1
EndIf
End
[EDIT]
Hab das SetGadgetFont mal hinter das StringGadget gepackt
[/EDIT]
Verfasst: 13.12.2008 02:37
von hjbremer
zuerst einmal würde ich SetGadgetFont nach StringGadget benutzen !
und dann befürchte ich wird der gewünschte Font nicht gefunden.
Windows lädt immer einen Font dessen Name dem gewünschten am ähnlichsten ist.
Verfasst: 13.12.2008 03:04
von D@nte
Ok das mit dem SetGadgetFont war so nit beabsichtigt, kommt davon wenn man schnell was zusammenkopiert, im eigtl. Prog steht's nachdem das StringGadget instantiiert wurde.
Finden sollte er eigentlich beide, liegen in Windows\Fonts
simsun.ttc - SimSun & NSimSun (True Type) - SchriftArt : SimSun
gulim.ttc - Gulim & GulimChe & Dotum & DotumChe (True Type) - SchriftArt : Gulim
Sind beides Windows 'Standard' Schriftarten die zur Erweiterung für asiatische Zeichensätze oder wie sich das schimpft gehören und mit WORD etc funktionieren se einwandfrei.
Verfasst: 13.12.2008 03:38
von Kaeru Gaman
also, bei mir ist SimSun eine TTF... aber damit kann das nicht zusammenhängen.
deine codes sind falsch, du hast da Bytecodes drin, du musst aber Unicode verwenden.
Verfasst: 13.12.2008 13:22
von D@nte
Wie meinen?!
Auch nachdem ich ne "Nacht" drüber geschlafen hab bekomm ich's noch nit hin...
Soll ich jetzt statt ReadByte(#File) eine ReadString(#File, #PB_Unicode) verwenden oder wie?
Wenn ja, bekomm ich aber iwie nur nen String der 13 Zeichen hat und nit 25, ich weiß Bsp.-Codes sind uncool, wäre aber trotzdem für einen dankbar

Verfasst: 13.12.2008 15:10
von Kaeru Gaman
dein beispiel-string, der Kauderwelsch, hat ja auch nur 13 Zeichen!
also, wenn du nen string mit 13 zeichen bekommst, sollte das eigentlich genau der sein den du suchst.
wobei, wenn du 25 zahlen hast, musst du wohl UTF codierung nehmen,
weil die drei nur durch 1 byte ausgedrückt wird,
für Unicode müßtest du wohl noch 'ne null hinter der 52 einfügen.
also, beispielcode mit sowas in Data is irgendwie schlecht.
probiers doch erstmal mit ReadString(#File, #PB_Unicode).
... außerdem bleibt dann immer noch die Frage, ob dein Gadget überhaupt Unicode darstellen kann.
Verfasst: 14.12.2008 17:15
von D@nte
*immernoch den kopp vor die Wand hau*
Man sollte auch die Zeichen vom gewünschten Ergebnis (黄昏圣殿3区单人模式阻挡门) zählen und nit etwa die Anzahl der Bytes im Hexstring...
Und auch Unicode-Executeable erstellen sollte man für sowas nicht ausmachen...
Nichts desto trotz funktionierts immer noch nicht richtig, immerhin weiß ich nu nach ca. 2h simsun.ttf & gulim.ttf suchen, dass PB nit intressiert obs .ttc oder .ttf ist...

das macht er nu daraus, oben SimSun unten Gulim und eigentlich sollte es ja zumindest in SimSun das sein : 黄昏圣殿3区单人模式阻挡门
test.data
Code: Alles auswählen
LoadFont (0, "SimSun", 40)
If ReadFile(1, "C:\test.data")
text.s = ReadString(1, #PB_Unicode)
CloseFile(1)
EndIf
If OpenWindow(0, 100, 200, 620, 80, "Font Test")
If CreateGadgetList(WindowID(0))
StringGadget(0, 10, 10, 600, 60, "")
EndIf
SetGadgetFont(0, FontID(0))
SetGadgetText(0, text)
Repeat
EventID = WaitWindowEvent()
If EventID = #PB_Event_CloseWindow
quit = 1
EndIf
Until quit = 1
EndIf
End
[EDIT]
Nu weiß ich auch wo das Problem liegt...
PB nimmt wohl irgendwie von Haus aus an, dass es für das StringGadget das Skript bzw den Sub Charset "GB3212" verwenden soll benötigen tu ich aber für die korrekte Darstellung den "GB18030", gibt's in PB irgendwie ne Möglichkeit das umzustellen ggf auch über WinAPI?
[/EDIT]
Verfasst: 14.12.2008 17:18
von Kaeru Gaman
D@nte hat geschrieben:Nu weiß ich auch wo das Problem liegt...
PB nimmt wohl irgendwie von Haus aus an, dass es für das StringGadget das Skript bzw den Sub Charset "GB3212" verwenden soll benötigen tu ich aber für die korrekte Darstellung den "GB18030", gibt's in PB irgendwie ne Möglichkeit das umzustellen ggf auch über WinAPI?
WOW!
wie sagte meine Omma immer? "Du kannst alt werden wie ne Kuh, du lernst immer noch dazu."
also, wenn du das rausgefunden hast, würdest du dann bitte ein Topic im FAQ verfassen?
mag sein, dass man eher selten drüber stolpert, aber wenn man's nicht weiß, dann stolpert man garantiert drüber wenn mans versucht.
Verfasst: 16.12.2008 21:08
von D@nte
Kaeru Gaman hat geschrieben:also, wenn du das rausgefunden hast, würdest du dann bitte ein Topic im FAQ verfassen?
Jo WENN, da ich aber anscheinend auf absoluten Kriegsfuss mit WinAPI stehe wird das wohl nix werden...
[OT]btw brauchen wird's wahrscheinlich jeder der in ein paar Jahren kommerzielle Software für den asiatischen (oder war's nur China) Markt schreiben will, ist bei denen per Gesetz für neue Programme (atm nur Betriebssystenme) Vorraussetzung das die GB18030 interpretieren 'können'.[/OT]
Ich glaube zwar theoretisch zu wissen, mit welchem WinAPI-Befehl man nen Unicode String in nen "BG18030"-String konvertiert aber iwie will's nit hinhauen, wie gesagt WinAPI versteh ich anscheinend echt #NULL von und die msdn ist nicht wirklich ne große Hilfe...
Hab's atm so weit:
Code: Alles auswählen
Enumeration
#Window
#File
#Library
#String_0
#Font
EndEnumeration
LoadFont (#Font, "SimSun", 40)
If ReadFile(#File, "test.data")
text.s = ReadString(#File, #PB_Unicode)
CloseFile(#File)
EndIf
temp.s = Space(Len(text))
lpWideCharStr = @text
cchWideChar = Len(text)
lpMultiByteStr = @temp
cchMultiByte = Len(temp)
CodePage = 54936 ; CofePage of GB18030
dwFlags = 0 ; Otherwise, the function fails with ERROR_INVALID_FLAGS
; OpenLibrary(#Library, "c_g18030.dll")
; Debug CallFunction(#Library, "UnicodeToBytes", lpWideCharStr, cchWideChar, lpMultiByteStr, cchMultiByte)
WideCharToMultiByte_(CodePage, dwFlags, lpWideCharStr + 1, cchWideChar, lpMultiByteStr + 1, cchMultiByte, 0 ,0)
If OpenWindow(#Window, 100, 200, 620, 80, "Font Test")
If CreateGadgetList(WindowID(0))
StringGadget(#String_0, 10, 10, 600, 60, "")
EndIf
SetGadgetFont(#String_0, FontID(#Font))
SetGadgetText(#String_0, temp)
Repeat
EventID = WaitWindowEvent()
If EventID = #PB_Event_CloseWindow
quit = 1
EndIf
Until quit = 1
EndIf
End
Referenzen für das ganze hab ich aus der msdn, sollten also richtig sein, die DLL hat (angeblich) jeder WinXP-Nutzer, wenn man die DLL kennt findet man auch den UnicodeToBytes-Befehl allerdings ist dann schon der Satz
msdn hat geschrieben:Do not use this function. When converting Unicode characters to GB18030 bytes, use the WideCharToMultiByte function.
für mich überaus verwirrent, aber gut nimmt man halt WideCharToMultiByte mit der CodePage 54936 für GB18030 aber bekomm trotz allem nur Murks raus "茠茳舷쨹4 ", aber immerhin isses scho Murks den google frisst...
Also bleibt wohl die Frage was ich bei der Benutzung der WinAPI falsch mache...
[EDIT]
Anscheinend mag phpBB keine URL-Tags mit aspx deshalb hier nochmal:
http://msdn.microsoft.com/en-us/library ... 85%29.aspx UnicodeToBytes-Befehl
http://msdn.microsoft.com/en-us/library ... 85%29.aspx WideCharToMultiByte
http://msdn.microsoft.com/en-us/library ... 85%29.aspx CodePage
[/EDIT]
Verfasst: 16.12.2008 21:26
von Kaeru Gaman
>> Anscheinend mag phpBB keine URL-Tags mit aspx deshalb hier nochmal:
doch, das problem sind die klammern, die musst du escapen.
ersetze ( durch %28 und ) durch %29