LoadFont und ttc

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
D@nte
Beiträge: 324
Registriert: 24.04.2007 15:33
Wohnort: Berlin

LoadFont und ttc

Beitrag 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 :oops:
[/EDIT]
Zuletzt geändert von D@nte am 13.12.2008 03:08, insgesamt 1-mal geändert.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag 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.
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
D@nte
Beiträge: 324
Registriert: 24.04.2007 15:33
Wohnort: Berlin

Beitrag 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.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
D@nte
Beiträge: 324
Registriert: 24.04.2007 15:33
Wohnort: Berlin

Beitrag 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 :(
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
D@nte
Beiträge: 324
Registriert: 24.04.2007 15:33
Wohnort: Berlin

Beitrag 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...

Bild
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]
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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! :o

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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
D@nte
Beiträge: 324
Registriert: 24.04.2007 15:33
Wohnort: Berlin

Beitrag 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]
Zuletzt geändert von D@nte am 17.12.2008 20:16, insgesamt 1-mal geändert.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten