Fondamentalmente voglio essere in grado di creare istanze usando una classe chiamata Bottle: ad es. class Bottle(object):...
e quindi in un altro modulo essere in grado di "stampare" semplicemente qualsiasi istanza senza dovendo modificare il codice per chiamare esplicitamente una routine di codifica dei caratteri.Python: come forzare una "stampa" per usare __unicode__ invece di __str__, o altrimenti "stampare" il messaggio senza chiamare esplicitamente unicode()
In sintesi, quando provo:
obj=Bottle(u"味精")
print obj
o ad un "a posto" "stampa":
print Bottle(u"味精")
ottengo:
"UnicodeEncodeError: 'ascii' codec can't encode characters"
domande StackOverflow simili:
- unicode class in Python
- how to print chinese word in my code.. using python
- Python string decoding issue
- python 3.0, how to make print() output unicode?
¢ Non è attualmente possibile passare python3. ¢
Una soluzione o suggerimento (e spiegazione) su come eseguire una stampa utf-8 sul posto (proprio come la classe U fa con successo di seguito) sarebbe molto apprezzata. :-)
Thanx N
-
codiceEsempio:
-------- 8> < - - - - tagliare qui - - - -
#!/usr/bin/env python
# -*- coding: utf-8 -*-
def setdefaultencoding(encoding="utf-8"):
import sys, codecs
org_encoding = sys.getdefaultencoding()
if org_encoding == "ascii": # not good enough
print "encoding set to "+encoding
sys.stdout = codecs.getwriter(encoding)(sys.stdout)
sys.stderr = codecs.getwriter(encoding)(sys.stderr)
setdefaultencoding()
msg=u"味精" # the message!
class U(unicode): pass
m1=U(msg)
print "A)", m1 # works fine, even with unicode, but
class Bottle(object):
def __init__(self,msg): self.msg=msg
def __repr__(self):
print "debug: __repr__",self.msg
return '{{{'+self.msg+'}}}'
def __unicode__(self):
print "debug: __unicode__",self.msg
return '{{{'+self.msg+'}}}'
def __str__(self):
print "debug: __str__",self.msg
return '{{{'+self.msg+'}}}'
def decode(self,arg): print "debug: decode",self.msg
def encode(self,arg): print "debug: encode",self.msg
def translate(self,arg): print "debug: translate",self.msg
m2=Bottle(msg)
#print "B)", str(m2)
print "C) repr(x):", repr(m2)
print "D) unicode(x):", unicode(m2)
print "E)",m2 # gives: UnicodeEncodeError: 'ascii' codec can't encode characters
-------- 8> < - - - - tagliare qui - - - - Python 2.4 uscita:
encoding set to utf-8
A) 味精
C) repr(x): debug: __repr__ 味精
{{{\u5473\u7cbe}}}
D) unicode(x): debug: __unicode__ 味精
{{{味精}}}
E) debug: __str__ 味精
Traceback (most recent call last):
File "./uc.py", line 43, in ?
print "E)",m2 # gives: UnicodeEncodeError: 'ascii' codec can't encode characters
UnicodeEncodeError: 'ascii' codec can't encode characters in position 3-4: ordinal not in range(128)
-------- 8> < - - - - tagliare qui - - - - Python 2.6 uscita:
encoding set to utf-8
A) 味精
C) repr(x): debug: __repr__ 味精
Traceback (most recent call last):
File "./uc.py", line 41, in <module>
print "C) repr(x):", repr(m2)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 3-4: ordinal not in range(128)
l'uscita non riflette il codice esempio, 'repr (x)' 'dovrebbe produrre UnicodeEncodeError' troppo – jfs
@ J.F. Sebastian: Python 2.4 produce quanto sopra, quindi ho eseguito il codice su 2.6 e repr ora produce anche un messaggio di errore. – NevilleDNZ
Il messaggio "UnicodeEncodeError: 'ascii' codec non può codificare i caratteri" mi fa sospettare che "print" non usi "sys.stdout" come ho cambiato il codec/encoding di questo file in "utf-8" con "sys.stdout" = codecs.getwriter (encoding) (sys.stdout) " – NevilleDNZ