[WIN] Font: GB18030 Konvertierung

Hier kannst du häufig gestellte Fragen/Antworten und Tutorials lesen und schreiben.
Benutzeravatar
D@nte
Beiträge: 324
Registriert: 24.04.2007 15:33
Wohnort: Berlin

[WIN] Font: GB18030 Konvertierung

Beitrag von D@nte »

Hier ein kleines Programm, das zeigt wie man einen Unicode-String in das GB18030 Format konvertiert.

Inhalt test.data:
BBC6BBE8CAA5B5EE33C7F8B5A5C8CBC4A3CABDD7E8B5B2C3C500000000

Code: Alles auswählen

Enumeration
  #Window
  #File
  #Library
  #String_0
  #String_1
  #String_2
  #Font
EndEnumeration

LoadFont (#Font, "SimSun", 40)

If ReadFile(#File, "C:\test.data")
  input.s = ReadString(#File, #PB_Unicode)
  CloseFile(#File)
EndIf

#UseDLL = 0                               ; 1 use transformation via c_g18030.dll
                                          ; 0 use transformation via MultiByteToWideChar_ / WideCharToMultiByte_
output.s = Space(Len(input))

If #UseDLL
  pcchLeftOverBytes.s = Space(Len(input)) ; UINT that contains GB18030 bytes at the end of the buffer
                                          ; that cannot be converted. These bytes could be the leading
                                          ; bytes of valid GB18030 bytes in the Next incoming GB18030 bytes.

  OpenLibrary(#Library, "c_g18030.dll")
    CallFunction(#Library, "BytesToUnicode", @input, Len(input)*2, @pcchLeftOverBytes, @output, Len(output)*2)
                                          ; Transforms Unicode (GB2212) to GB18030
    output2.s = Space(Len(output))
    CallFunction(#Library, "UnicodeToBytes", @output, Len(output), @output2, Len(output2) * 2)
                                          ; Transforms GB18030 to Unicode (GB2212)
Else
  CodePage  = 54936                       ; CodePage of GB18030
  dwFlags   = 0                           ; Otherwise, the function fails with ERROR_INVALID_FLAGS 

  MultiByteToWideChar_(CodePage, dwFlags, @input, Len(input)*2, @output, Len(output)*2)
                                          ; Transforms Unicode (GB2212) to GB18030
  output2.s = Space(Len(output))
  WideCharToMultiByte_(CodePage, dwFlags, @output, Len(output)*2, @output2, Len(output2) * 2, 0, 0)
                                          ; Transforms GB18030 to Unicode (GB2212)
EndIf

If OpenWindow(#Window, 100, 200, 750, 200, "GB18030 transformation demo")
  If CreateGadgetList(WindowID(0))
    StringGadget(#String_0, 10,  10, 730, 60, "Unicode (GB2212)")
    StringGadget(#String_1, 10,  70, 730, 60, "Unicode (GB2212) -> GB18030")
    StringGadget(#String_2, 10, 130, 730, 60, "GB18030 -> Unicode (GB2212)")
  EndIf

  SetGadgetFont(#String_0, FontID(#Font))
  SetGadgetFont(#String_1, FontID(#Font))
  SetGadgetFont(#String_2, FontID(#Font))

  SetGadgetText(#String_0, input)
  SetGadgetText(#String_1, output)
  SetGadgetText(#String_2, output2)

  Repeat
    EventID = WaitWindowEvent()
    If EventID = #PB_Event_CloseWindow
      quit = 1
    EndIf
  Until quit = 1
EndIf
End
Startet man das Programm sollte das Ergebnis so aussehen:
Bild
oben: Unicode-String in GB2312 dargestellt
mitte: Unicode-String in GB18030 konvertiert
unten: GB18030-String zurück in Unicode-String (GB2312) konvertiert


Titel ergänzt - Suchtags hinzugefügt - Kaeru fecit

Suchtags:
Zeichensatz Font Schriftzeichen Unicode Gadget Darstellung
Zuletzt geändert von D@nte am 20.12.2008 15:20, insgesamt 3-mal geändert.
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Beitrag von Kukulkan »

Hallo D@nte,

Danke für den Tipp. :allright:

Sollte man noch erwähnen, dass das nur für Windows gilt, weil die Konvertierung von Windows, nicht vom Programm selbst, durchgeführt wird? Für Linux und MacOS geht das so leider nicht.

Volker
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Danke fürs posten, D@nte!


@All

wenn einem noch zusätzliche sinnvolle Suchtags einfallen, bitte bescheid sagen.
Ist ja ein eher seltenes Thema, man soll es finden können wenn man es braucht.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Kaeru Gaman hat geschrieben:wenn einem noch zusätzliche sinnvolle Suchtags einfallen, bitte bescheid sagen.
Ist ja ein eher seltenes Thema, man soll es finden können wenn man es braucht.
Chinesiche Schriftzeichen

Hm, naja die anderen Betriebssysteme werden ja wohl auch ne
entsprechende Funktion eingebaut haben, oder nicht?

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

"Schriftzeichen" steht drin wie du siehst.
"chinesisch" muss nicht rein, sonst müßte ich ja auch noch "asiatisch" und "koreanisch" und weiß der geier was noch reinschreiben...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Erst Fragen und wenns Antworten gibt beschweren ... schreib lieber :mrgreen:
... naja der Thread hat die Suchwörter ja eh jetzt drinn :lol:

ach ja ... im Kommentar im Code steht "CofePage" :wink:

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
D@nte
Beiträge: 324
Registriert: 24.04.2007 15:33
Wohnort: Berlin

Beitrag von D@nte »

Jaja hab nen paar Sachen vergessen *hust*
War auch schon spät oder war's scho wieder früh?! Naja egal...

Also, natürlich konvertiert das Programm nicht selbst (hab ich auch nie behauptet) es benutzt lediglich WinAPI- bzw DLL-Befehle um die Strings auf das GB18030-Format zu mappen.
Und ja in der Theorie gibt's das auch für MacOS / den Pinguin aber da ich mit keinem von beiden wirklich was am Hut hab, kann ich dazu nicht mehr sagen, als dass es für JAVA Befehle gibt die dieses remapping auch durchführen...

Hab den ersten Post nochmal bisserl verändert, zum einen die Rückkonvertierung von GB18030 zu GB2312 gezeigt, zum anderen die Auswahl zwischen DLL-Benutzung oder WinAPI gelassen, alledings ist zur DLL zusagen das laut msdn diese Funktionen NICHT GENUTZT WERDEN SOLLEN, wenn wer rausfindet wieso kann er's ja hier posten, bei mir funktionieren beide Varianten einwandfrei.

Die DLL hat lt. M$ jeder der im Besitzt von WinXP und höher ist von hausaus.
Bei Win2k & NT kann man die m.E. nachinstallieren, find leider grad das Datenblatt zum Thema GB18030 nicht mehr, deshalb ohne Gewähr...

Zu weiteren Schlüsselwörtern sag ich nur soviel, GB18030 repräsentiert 27.484 Zeichen, da lassen sich also noch diverse andere Schlüsselwörter für finden ;p
Antworten