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

Aktuelle Zeit: Fr Jul 18, 2025 12:32

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



Ein neues Thema erstellen Auf das Thema antworten  [ 44 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags: Umlaute mit glutBitmapCharacter
BeitragVerfasst: Mo Mai 12, 2008 10:03 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mär 05, 2007 17:46
Beiträge: 42
Hi,

also ich programmiere mit OpenGl unter Lazarus (ganz ähnlich zu Delphi) und normalerweise kann man Text ganz einfach mit folgender Procedure ausgeben:
Code:
  1. procedure glWrite(X, Y: GLfloat; aFont: Pointer; Text: String);
  2. var
  3.   I: Integer;
  4. begin
  5.   glRasterPos2f(X, Y);
  6.   for I := 1 to Length(Text) do
  7.     glutBitmapCharacter(aFont, Integer(Text[I]));
  8. end;


Klappt auch wunderbar, wenn man als aFont GLUT_BITMAP_HELVETICA_12 übergibt.

Das Problem ist, dass Umlaute falsch dargestellt werden. Wisst ihr eine Lösung?

Gruß Alexander

_________________
"Weil", so schließt er messerscharf,
"nicht sein kann, was nicht sein darf." :)

Besuch doch mal: http://www.alexanderroth.eu


Zuletzt geändert von Alexander am Mo Mai 12, 2008 12:08, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 12, 2008 10:25 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Zunächst einmal, was meinst du mit "falsch dargestellt"?

GLUT gilt als veraltet und sollte möglichst nicht mehr verwendet werden. Statt dessen könntest du dir mal die Fontbibliothek von Lossy Ex anschauen (mir ist gerade der Name entfallen) oder dich mit SDL_TTF befassen (was bei Lazarus sowieso eine gute idee ist, zumindest wenn man dann auch noch den Rest von SDL verwendet :wink:).

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: Mo Mai 12, 2008 12:07 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mär 05, 2007 17:46
Beiträge: 42
also das ü wird durch 2 zeichen ersetzt die ich nicht kenne, so ein A mit einem ~ obendrauf und das andere Zeichen ist eine art Kästchen....
(also wahrscheinlich benutzt glut einen anderen Zeichensatz....)

hmmm also mit sdl kenne ich mich überhaupt nicht aus....
ich verwende einfach nur opengl mit den Units glut, gl, glu

hmmm ich finde auf lossy ex Homepage eigentlich nur glBitmap, ist ja aber nicht für Textausgabe.....

_________________
"Weil", so schließt er messerscharf,
"nicht sein kann, was nicht sein darf." :)

Besuch doch mal: http://www.alexanderroth.eu


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 12, 2008 12:39 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ahh. Woher beziehst du deine Textdaten? Denn das Phänomen, dass du beschreibst, ist unabhängig von glut. Du hast die Textdaten als UTF-8 vorliegen. Du musst sie vorher in Ansi umwandeln. Dafür gibt es unter FreePascal (also auch unter Lazarus) die Funktion UTF8ToAnsi.

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: Mo Mai 12, 2008 12:46 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mär 05, 2007 17:46
Beiträge: 42
ahhh ok ich probiere es gleich aus...

Danke!

EDIT:
Code:
  1. procedure TOGlLabel.glWrite(X, Y: GLfloat; aFont: Pointer; Text: String);
  2. var
  3.   I: Integer;
  4.   t:ansistring;
  5. begin
  6.   text:='Ähhhh'; //um sicher zu sein das es richtig ankommt
  7.   t:=UTF8ToAnsi(text);
  8.   glRasterPos2f(X, Y);
  9.   for I := 1 to Length(t) do
  10.     glutBitmapCharacter(aFont, Integer(t[I]));
  11. end;
hmmm also es hat sich irgendwie nichts verändert....

PS: Der Text steht direkt im Quellcode

_________________
"Weil", so schließt er messerscharf,
"nicht sein kann, was nicht sein darf." :)

Besuch doch mal: http://www.alexanderroth.eu


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 12, 2008 12:59 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Hmm... Wenn der Text direkt im Sourcecode steht, sollte auch eigentlich kein UTF8-Problem auftreten... Ich bin auch nicht sicher, ob UTF8ToAnsi wirklich funktioniert (in der Manual fehlt eine Beschreibung), da ich mit SDL_TTF rendere zeichne ich den Text gleich als UTF8...

Vielleicht kann dir hier ja jemand anderes weiterhelfen.

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: Mo Mai 12, 2008 14:31 
Offline
DGL Member

Registriert: Mo Nov 06, 2006 17:18
Beiträge: 20
Wohnort: Dresden/Löbau
Servus!

@Alexander

AFAIK verwendet Lazarus standardmäßig UTF8; zumindest unter Linux. Ob es unter Windows auch so ist, kann ich jetzt nicht sagen (kanns auch nicht testen, hab kein Windows mehr drauf) allerdings wollten die auch dort UTF8 per default nutzen. Obs allerdings schon so weit ist... kA

Ansonsten: Ich hab das mal so gehandhabt, dass ich Zeichen wie Umlaute etc. direkt als Code eingegeben habe, sprich:

Code:
  1. myString := 'Morgenr' + #246 + 'te';


Wobei 246 der Dezimalcode des kleinen "ö" ist. Das ist allerdings ziemlich umständlich, daher: Den zu erstellenden Text am besten in einem externen Editor schreiben, und dann mit einer passenden Codierung abspeichern (z.B. ISO-8859-1).


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 12, 2008 15:30 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mär 05, 2007 17:46
Beiträge: 42
ahhhh klappt. Danke!

mhmm beides ist Umständlich aber wohl nicht zu ändern......

EDIT:
ich bekomme es einfach nicht hin aus dem ö den richtigen Code herauszubekommen:
Code:
  1. ord(String2Char(Utf8ToAnsi('ö'))

mit
Code:
  1. function String2Char(s: ansistring): ansichar;
  2. begin
  3.   if Length(s)=0 then
  4.     exit;
  5.   Result:=s[1];
  6. end;
es ist echt vertrackt.....

Ich MUSS es doch in den richigen Code umwandeln können... aber wie?
Denn dann kann ich mit chr einfach das richtige Zeichen produzieren.....

_________________
"Weil", so schließt er messerscharf,
"nicht sein kann, was nicht sein darf." :)

Besuch doch mal: http://www.alexanderroth.eu


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 12, 2008 16:06 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mär 05, 2007 17:46
Beiträge: 42
na ja ok.
@blackstar: Die Funktion klappt und sollte einem das ständige Nachschauen erleichtern:
Code:
  1. function KorrectUmlaut(s: string): char;
  2. begin
  3.   if s='ö' then         Result:=chr(246)
  4.   else if s='Ö' then    Result:=chr(214)
  5.   else if s='ä' then    Result:=chr(228)
  6.   else if s='Ä' then    Result:=chr(196)
  7.   else if s='ü' then    Result:=chr(252)
  8.   else if s='Ü' then    Result:=chr(220)
  9.   else if s='ß' then    Result:=chr(223);
  10. end;
  11.  

_________________
"Weil", so schließt er messerscharf,
"nicht sein kann, was nicht sein darf." :)

Besuch doch mal: http://www.alexanderroth.eu


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 12, 2008 16:09 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mär 05, 2007 17:46
Beiträge: 42
hmmm Lazarus hat das Problem nur manchmal......
hmmm seltsam.....
ich muss noch ausprobieren....

_________________
"Weil", so schließt er messerscharf,
"nicht sein kann, was nicht sein darf." :)

Besuch doch mal: http://www.alexanderroth.eu


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 12, 2008 17:43 
Offline
DGL Member

Registriert: Mo Nov 06, 2006 17:18
Beiträge: 20
Wohnort: Dresden/Löbau
Also wie schon gesagt: Am besten kommst Du, wenn Du einfach den Text in einem Editor erstellst, und dann abspeicherst und zur Laufzeit lädst. Unter was arbeitest Du eigentlich, Windows? Der Standard Texteditor von Windows speichert AFAIK in ANSI ab, daher sollte es damit klappen. Denn:
Mit Deiner Funktion musst du ja (wenns dumm kommt) noch ner ganzen Stange mehr Zeichen ihren Code zuordnen.

Ansonsten kannst Du auch folgendes überlegen:
Mach eine Unit StrConstants oder so, wo alle Strings als Konstanten abgespeichert sind. Die Unit erstellst Du aber nicht mit Lazarus, sondern mit einem externen Editor, und speicherst dann entsprechend in der passenden Kodierung ab.

Zitat:
ich bekomme es einfach nicht hin aus dem ö den richtigen Code herauszubekommen:
Code:
ord(String2Char(Utf8ToAnsi('ö'))

mit
Code:
function String2Char(s: ansistring): ansichar;
begin
if Length(s)=0 then
exit;
Result:=s[1];
end;
es ist echt vertrackt.....


Damit kann es im übrigen nicht gehen, denn:
In UTF8 ist ein Zeichen nicht unbedingt genau ein Byte lang. Die Umlaute beispielsweise werden mit zwei Byte abgespeichert. Sprich: Du kannst auf einen UTF8 String nicht unbedingt per Index auf ein einzelnes Zeichen zugreifen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 12, 2008 20:53 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mär 05, 2007 17:46
Beiträge: 42
hmmm ich glaube die funktion (äöü..) reicht fürs erste... ist auf jeden Fall nicht sooo viel mehr Arbeit, da es nicht so viele Strings sind.

aber wie ich vorhin gesagt habe, verstehe ich langsam garnichts mehr, da anscheinend manchmal die Umlaute klappen und manchmal nicht.... ich muss noch rausfinden wieso....


PS: Dass ich auf einen Umlaut nicht mit s[1] zugreifen kann ist schade....

_________________
"Weil", so schließt er messerscharf,
"nicht sein kann, was nicht sein darf." :)

Besuch doch mal: http://www.alexanderroth.eu


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 13, 2008 06:28 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Also mir schauts verflixt danach aus, als ob es was mit dem CHARACTER SET zu tun hätte. UTF-8 ist ja nur ein Encoding (WIE wird der Unicode gespeichert) es geht aber um den Unicode selbst (WELCHER Unicode wird genommen), das sind zwei verschiedene Dinge. Vielleicht kann man das Default Charset umstellen?
Traude


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 13, 2008 08:56 
Offline
DGL Member

Registriert: Mo Nov 06, 2006 17:18
Beiträge: 20
Wohnort: Dresden/Löbau
Also:
Hab gerade mal fix die GLUT Demo, die beim FPC mit dabei ist, modifiziert und geschaut, mit welchen Character Sets GLUT klar kommt. Die ganzen Westeuropäischen ISO8859 Kodes wurden dabei richtig dargestellt (also 8859-1, -14 und -15).
Gemäß dieser Seite...
http://www.opengl.org/documentation/specs/glut/spec3/node76.html
...würde ich auch schließen, dass intern ISO8859-1 verwendet wird. Ob man das zu verwendende Character Set umstellen kann... k.A, sieht aber schlecht aus. Zumindest findet sich in der Spezifikation in der Rubrik "Font Rendering" nichts zum Thema.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 14, 2008 09:25 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Die GLUT wird intern nur "Bitmaps" von den verschiedenen Fonts haben die dann bei Bedarf gezeichnet weren. Von daher wird die vermutlich nur maximal 256 Zeichen besitzen. Auf der Dokumentations Seite von Glut (link von blackstar) sieht man als letzten Bestandteil immer "iso8859-1". Denke die machen nur das. Ist auch die einfachste CodePage.

Und ich würde auch in jedem Fall sagen, dass die Zeichen UTF-8 sind. Denn UFT-8 codiert alle erweiterten Zeichen CharCode über 127 in 2 oder bis zu 4 Bytes.

Und solchen Lösungen, dass man sich den String zusammenbasteln muss kann eigentlich nicht das Wahre sein. Denn das geschieht dann zu Laufzeit und da passiert wesentlich mehr als man auf en ersten Blick vermuten mag. Könnte es evtl daran liegen, dass Lazarus die SourceDatei als UTF-8 abspeichert und nicht als ANSI? Denn dann befinden sich in dem Text von Hause aus 2 Zeichen und der Kompilier kopiert sie bloß so direkt in die Anwendung.

Das Projekt wovon Lord Horazont gesprochen hat heißt TextSuite. Derzeit ist davon auf meiner Webseite nur die Dokumentation zu finden. Allerdings ist das alles noch in Arbeit und nicht vollständig. Ja das geht auch problemlos mit FreePascal und für UTF-8 muss man lediglich die "Codepage" UTF-8 einstellen.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 44 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 11 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.010s | 15 Queries | GZIP : On ]