martol1ni Skrevet 7. november 2011 Del Skrevet 7. november 2011 Jeg har laget et program i Python 2.7, med Tkinter gui. Jeg har lagret UTF-8 koding lokalt i fila, og den kan printe alle karakterer fint. Problemet oppstår i min entryvariabel (StringVar), når jeg henter inn æ, ø eller å. Når jeg skal kjøre en funksjon, funk(entryvariabel.get()) leser den av unikodekoden, som jo blir helt på trynet. Jeg vil den skal lese inn feks 'kø'. Noen som har peiling? Dette er erroren jeg får: Warning (from warnings module): File "C:\pythonprog\scrabble\feud.py", line 46 if s not in liste and s in ordliste: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal Exception in Tkinter callback Traceback (most recent call last): File "C:\Python\lib\lib-tk\Tkinter.py", line 1410, in __call__ return self.func(*args) File "C:\pythonprog\scrabble\feud.py", line 19, in siord if len(ordene) == 0: NameError: global name 'ordene' is not defined Se bort i fra NameError o.l, UniCodeWarning jeg ikke forstår. Takk Lenke til kommentar
aC Skrevet 7. november 2011 Del Skrevet 7. november 2011 vel hvis du tar utgangspunkt i stacktrace'en fra python UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal og if len(ordene) == 0: NameError: global name 'ordene' is not defined Så er det jo ganske klart hvor problemet ligger Lenke til kommentar
FraXinuS Skrevet 7. november 2011 Del Skrevet 7. november 2011 Du enten gjøre verdiene i "liste" og "ordliste" om til unicode eller du kan gjøre "funk(entryvariabel.get().encode('utf-8'))" Lenke til kommentar
martol1ni Skrevet 7. november 2011 Forfatter Del Skrevet 7. november 2011 (endret) Jeg har prøvd frem og tilbake med encoding, tror ikke jeg helt forstår det.. Hvis ordinn.get() er definert som en StringVar i entryboks, endret til "køl*e", Jeg tester dette i shellet mitt. ordinn = StringVar(None) tekstboks = Entry(root, textvariable = ordinn) >>> ordinn.get() u'k\xf8l*e' >>> print ordinn.get() køl*e >>> ordinn.get().encode('utf-8') 'k\xc3\xb8l*e' >>> print ordinn.get().encode('utf-8') køl*e Endret 7. november 2011 av martol1ni Lenke til kommentar
FraXinuS Skrevet 7. november 2011 Del Skrevet 7. november 2011 Det der skjer mest sannsynlig fordi terminalen din ikke bruker utf-8 encoding. For å sjekke hvilken encoding som brukes kan du gjøre: import sys print sys.stdout.encoding print ordinn.get().encode(sys.stdout.encoding) Lenke til kommentar
martol1ni Skrevet 7. november 2011 Forfatter Del Skrevet 7. november 2011 (endret) Da får jeg ut cp1252. Når jeg prøver å skrive f. eks, s = 'kø*le'.encode('utf-8') får jeg erroren igjen.. Traceback (most recent call last): File "<pyshell#38>", line 1, in <module> s = 'kø*le'.encode('utf-8') UnicodeDecodeError: 'ascii' codec can't decode byte 0xf8 in position 1: ordinal not in range(128) Endret 7. november 2011 av martol1ni Lenke til kommentar
FraXinuS Skrevet 7. november 2011 Del Skrevet 7. november 2011 Det skjer fordi når terminalen din er satt til cp1252-encoding så vil en strengen 'kø*le' være cp1252-encodet. Når du kjører: s = 'kø*le'.encode('utf-8') vil python først prøve å decode strengen til unicode med default codec 'ascii', men det feiler fordi ascii støtter ikke 'ø'. For at det skal funke må du først decode strengen til unicode med riktig codec (cp1252) før du encoder den til utf-8: s = 'kø*le'.decode('cp1252').encode('utf-8') Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå