Mam problem z string.format()
Pythona i przekazywanie do niego ciągów Unicode. Jest to podobne do this older question, z tym że w moim przypadku kod testowy wybucha na wydruku, a nie na wywołaniu logging.info()
. Przekazywanie tego samego obiektu napisowego Unicode do obsługi rejestrowania działa dobrze.Python's string.format() i Unicode
Nie powiedzie się równie dobrze ze starszym formatem %
, jak i string.format()
. Aby upewnić się, że jest to obiekt typu string, który jest problemem, a nie drukowanie źle współpracujące z moim terminalem, próbowałem przypisać sformatowany ciąg do zmiennej przed drukowaniem.
def unicode_test():
byte_string = '\xc3\xb4'
unicode_string = unicode(byte_string, "utf-8")
print "unicode object type: {}".format(type(unicode_string))
output_string = "printed unicode object: {}".format(unicode_string)
print output_string
if __name__ == '__main__':
unicode_test()
Obiekt tekstowy wydaje się zakładać, że otrzymuje ASCII.
% python -V
Python 2.7.2
% python ./unicodetest.py
unicode object type: <type 'unicode'>
Traceback (most recent call last):
File "./unicodetest.py", line 10, in <module>
unicode_test()
File "./unicodetest.py", line 6, in unicode_test
output_string = "printed unicode object: {}".format(unicode_string)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf4' in position 0: ordinal not in range(128)
Próbujesz rzucić output_string
, ponieważ Unicode nie robi żadnej różnicy.
output_string = u "drukowany obiekt unicode: {}". Format (unicode_string)
Am I brakuje czegoś tutaj? Dokumentacja obiektu typu string wydaje się całkiem jasna, że to powinno działać tak, jak próbuję go użyć.
Użycie kodu jak powyżej, ale kontynuacja 'drukowanego obiektu unicode' z' u' działa dla mnie (Python 2.6.5 i 2.7). Czy błąd pojawia się, gdy robisz to samo, co wymienione powyżej? – RocketDonkey
Czekaj ... kodujesz strumień bajtów Unicode, który ma reprezentować już zakodowany strumień Unicode? Jaki znak powinien zostać wydrukowany powyżej dla ''\ xc3 \ xb4'':' ô' lub 'Ã''? –
Powinno to być ô. Przykład kodowania został skopiowany dosłownie z przywołanego starszego posta o module logowania. – mpounsett