Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 08:16

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Unicode mit Freetype
BeitragVerfasst: Di Jun 10, 2008 15:11 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

ich benutze FreeType um text darzustellen, klappt wunderbar.. nur, wie kann ich mit FreeType unicode darstellen?

Wenn ich z.B. versuche ein "ä" darzustellen bekomme ich nur 2 kästchen... hat da irgendwer ne idee?
Ich hab meinen string als char* vorliegen (C++), woher weiß ich ob das nächste zeichen jetzt 1. 2 oder 4 byte lang ist?

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 10, 2008 15:31 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Du hast da wohl UTF-8 vorliegen. Schau dir dazu am besten mal den UTF-8 Artikel auf Wikipedia an, wenn du da wirklcih was drehen willst. Ansonsten solltest du mal schauen, ob du FreeType nicht vielleicht zu UTF-8 "überredet" bekommst. Ich kenne diese Bibliothek nicht, aber es würde mich wundern, wenn es da keine möglichkeit für UTF-8-Rendering gibt.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 10, 2008 16:56 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
FreeType kenne ich aktuell auch noch nicht. Frag mich das aber später noch mal. ;)

Oder aber du nimmst als Typen wchar_t * das ist der WideChar Type von C++. Vergleichbar mit WideString in Pascal. Und FreeType sollte eigentlich mit 16 wenn nicht sogar mit 32 Bit CharCodes arbeiten. Damit sollte das dann auch gehen. Wobei ich net weiß welche Methode du da von Freetype benutzt hast.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 10, 2008 17:08 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Lossy schrieb:
Zitat:
Und FreeType sollte eigentlich mit 16 wenn nicht sogar mit 32 Bit CharCodes arbeiten.

Ja es kann, ich kann das bestätigen.

Das Problem liegt vermutlich an C++. Google mal mit C++ und UTF8 oder Unicode , ein flüchtiger Blick hat mir gezeigt, dass da was zu finden ist, ich hab es mir aber nicht genau angesehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 10, 2008 17:39 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

ich benutze die FT_Load_Char funktion, die erwartet als parameter für das zeichen einen "unsigned long".. also denke ich mal das ich meinen char* irgendwie selber in die unicode zeichen zerlegen muß, oder?

Oder wie schaut das aus mit dem wchar_t? Funktioniert der genauso wie nen char* nur halt das er automatisch das unicode gedönse macht? ^^

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 10, 2008 17:57 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also das char* ist ja normaler ansi string und wie Lord Horazont gesagt hat in deinem Fall UTF-8 codiert. Wenn du jetzt Zeichen für Zeichen ausließt würdest du anstelle deines 'ä' 2 Zeichen bekommen.

Das wchar_t wird überall im Windows verwendet bzw. habe ich auch in dem Header von meinen Fonts benutzt. Und da kam bei mir das passenden an. wchar_t wird meines Wissens nach in 2 Byte pro Zeichen gespeichert. Damit sind dann alle Zeichen gleich groß. Ich hatte das bei mir als konstanten Text benutzt. Wenn du das aus einer Datei ausließt dann kann das natürlich alles mögliche sein. Das müsstest du erst umwandeln. Aber wie? Keine Ahnung. Und ob das so ohne weiteres wie in Delphi unterstützt wird weiß ich auch nicht.

Wobei mir gerade wieder einfällt, dass wchar_t glaube ich unter mac von einigen Kompilern gar nicht unterstützt wird. Da hatte ich dann unsigned short benutzt. Ob es aber geht weiß ich beim besten Willen nicht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 10, 2008 18:00 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
ok.. dann werde ich als erstes heute abend mal testen die char* 's "einfach" selbst in unicode zu zerlegen.. auf Wikipedia steht ja gut beschrieben wie es geht.. "wenn der char > 127 ist dann ist es 2 byte lang" etc.. mal schauen was rauskommt dabei :)

Wenn das nicht klappt werd ich es mit wchar_t testen bzw ne alternative für mac suchen (nachdem ich am mac arbeite werd ich schnell feststellen ob das geht.. ^^)

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 10, 2008 19:16 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Du kannst auch bei meinen Fonts mal schauen. Dort ist eine Unit Namens "TextSuiteWideUtils.pas" enthalten. In der gibt es eine Methode tsAnsiUTF8ToWide die einen UTF-8 String in einen WideString konvertiert. Besonders interessant daran sind die Magic Numbers die das Dekodieren erleichtern.

Bzw stammt der Code eigentlich auch so halb von Unicode.org. Dort gibts fertigen Code für UTF-8. Schau mal da. Eines ist neuer aber wo der Unterschied ligt keine Ahnung. ;)

http://www.unicode.org/Public/PROGRAMS/CVTUTF/
http://www.unicode.org/Public/PROGRAMS/CVTUTF.OLD/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 10, 2008 20:29 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
So, habs jetzt getestet, klappt wunderbar mit meiner eigenen konvertierungs funktion :)
Dankeee

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jun 10, 2008 20:55 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Falls es jemals jemand braucht, das ist die funktion die ich mir gebastelt hab:

Code:
  1. typedef unsigned long UnicodeChar;
  2.  
  3. UnicodeChar getUnicodeChar(char *text, int &i)
  4. {
  5.     UnicodeChar unicodeID = text[i];
  6.     if ((unsigned char)text[i] > 0x7F) {
  7.         while ((unsigned char)text[i] > 0x7F) {
  8.             switch (((unsigned char)text[i] >> 6) & 0x3) {
  9.                 case 3: unicodeID = ((unsigned char)text[i] & 0x3F);
  10.                         break;
  11.                 case 2: unicodeID = (unicodeID << 6) | ((unsigned char)text[i] & 0x3F);
  12.                         break;
  13.                 default:
  14.                         break;
  15.             }
  16.             i++;
  17.         }
  18.         i--;
  19.     }
  20.     return unicodeID;
  21. }


Benutzt wird es dann so:
Code:
  1. for (int i = 0; i < numChars; i++) {
  2.   UnicodeChar unicodeID = getUnicodeChar(text, i);
  3.   // .. do something with the char .. //
  4. }


Aya~


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 15 Queries | GZIP : On ]