Umlaute in Pygame

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
xi11
User
Beiträge: 3
Registriert: Dienstag 13. September 2011, 15:00

Hallo,

auf einem pygame.display möchte ich Text anzeigen. Das klappt soweit auch gut, solange keine Umlaute im Spiel sind. Folgender Code zeigt nicht "ü" sondern "A 1/4" auf dem Display:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: latin-1 -*-

import pygame

black = [0,0,0]
white = [255,255,255]

pygame.init()
screen = pygame.display.set_mode([600,600])

def gameprint(text,xx,yy,color, font=pygame.font.get_default_font(),textsize=40):
   font = pygame.font.SysFont(font,textsize)
   ren = font.render(text,1,color)
   screen.blit(ren, (xx,yy))

umlaut = "ü"

while True:

    screen.fill(black)
    gameprint(umlaut, 300,300, white)
    pygame.display.flip()
Über Hilfe würde ich mich sehr freuen!

Vielen Dank!
xi11
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

xi11 hat geschrieben:auf einem pygame.display möchte ich Text anzeigen. Das klappt soweit auch gut, solange keine Umlaute im Spiel sind. Folgender Code zeigt nicht "ü" sondern "A 1/4" auf dem Display:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: latin-1 -*-
[...]
Bist du sicher, dass du die Datei auch als latin-1 und nicht als UTF-8 gespeichert hast?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ich habe das Script bei mir als utf-8 codiert gespeichert. Zudem habe ich einen Unicode-String übergeben:

Code: Alles auswählen

umlaut = u"ü"
Damit klappt das wunderbar :-)

Generell sehe ich keine Notwendigkeit, mit latin-1 oder irgendwelchen iso- oder cp-Codecs zu arbeiten.

Übergebe ich einen Bytestring klappt das bei mir auch nicht. In der Doku steht zwar, dass man beides übergeben kann, aber evtl. ist das eine falsche / veraltete Behauptung?

Edit: Ok, mit `iso-8859-15` und einem Bytestring klappt es auch wunderbar. Da es mit utf-8 nicht ging, vermute ich da irgend einen Zusammenhang mit dem Systemfont. Wobei mich das wundert: Denn auf meinem Archlinux hab ich in der Shell def. utf-8...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
xi11
User
Beiträge: 3
Registriert: Dienstag 13. September 2011, 15:00

Hallo Hyperion und /me,

vielen Dank für eure schnellen Antworten. Zusammen habt ihr mir die perfekte Antwort geliefert!

Natürlich habe ich total vernachlässigt mein Skript im entsprechenden Format zu speichern, also ein großes Dankeschön an /me.
Auch ein großes Dank an Hyperion, der das alles nochmal getestet hat!

Das ging jetzt so schnell und ich schlage mich schon seit Monaten immer wieder mit diesem Problem herum, vielen Dank Leute!

xi11
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wobei ich doch noch mal anmerken will, dass ich generell dazu neigen würde, auf Bytestrings zu verzichten, wenn es denn geht. Und laut Doku kann man ja mit Unicode-Strings arbeiten. Also würde ich Dir dann doch mal empfehlen das anzupassen :-)

Zusätzlich finde ich Dein latin-1 Encoding unschön, aber das sagte ich ja schon ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
xi11
User
Beiträge: 3
Registriert: Dienstag 13. September 2011, 15:00

Hey Hyperion,

also mit utf-8 geht es doch nicht oder? Da ich mich so wenig auskenne habe ich einfach irgendeine Kodierung, die nicht utf-8 ist genommen, in diesem Fall also latin-1. In meinem Projekt habe ich jetzt iso 8859-15 verwendet, einfach deswegen, weil ich gleich gefunden habe, wie ich als diese Codierung speichern. Ist das dann für dich in Ordnung?

Danke nochmal, viele Grüße,
xi11
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Bei mir geht es mit utf-8 nicht! ;-)

Aber die Codierung bezieht sich ja eh nur auf den Quelltext! Generell musst Du Dir den Unterschied Byte- vs. Unicodestring klarmachen. Dazu habe ich zwei wichtige und nützliche Links in meiner Sig ;-)

Eines vorweg: utf-8 != Unicode!!! Das war früher immer mein Hauptirrtum.

Also ich würde im Code immer auf Unicode setzen, wenn eine API das erlaubt. Und die Kodierung des Quellcodes würde ich immer so universell wie möglich auslegen - und das bedeutet utf-8. Das hat aber ja nur etwas damit zu tun, wie Strings in Deinem Quelltext codiert werden - und das hat erst mal noch nichts damit zu tun, ob man diese im Code dann als Byte- oder Unicode-Strings nutzt!

Kleines Beispiel:

Code: Alles auswählen

# Erzeugt einen Bytestring (Python 2.x)
text = "ü"
# Erzeugt einen Unicodestring (ebenfalls Python 2.x)
text = u"ü"
Kannst Du Dir per type(text) bestätigen lassen :-)
Damit die Wandlung (2. Beispiel) funzt, ist das Encoding-Coockie oben im Quellcode nötig, da Python sonst ASCII annimmt, was zum berühmten "UnicodeDecodeError" führt. Vorteil ist eben, dass Du in Unicode erst einmal alle Zeichen dieser Welt darstellen kannst und eine universelle Datenstruktur zum Austausch mit anderen Libs hast.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten