EDIT: (Główne zmiany pomiędzy tym edytować i poprzedniego ... note:. Używam Python 2.6.4 na Ubuntu)
Po pierwsze, moja pierwsza próba odpowiedzi , Podałem kilka ogólnych informacji na temat print
i str
, które zamierzam zostawić poniżej dla dobra każdego, kto ma prostsze problemy z print
i zastanawia się nad tym pytaniem. Jeśli chodzi o nową próbę poradzenia sobie z problemem doświadczanym przez OP ... Zasadniczo, jestem skłonny powiedzieć, że tutaj nie ma srebrnej kuli i jeśli print
w jakiś sposób udaje się zrozumieć dziwny ciąg literału, to nie jest to powtarzalne zachowanie . Mam doprowadziły do tego wniosku przez następujący zabawnej interakcji z Python w moim oknie terminala:
>>> print '\xaa\xbb\xcc'
��
Czy próbowałeś wprowadzić ª »i bezpośrednio z terminala? W terminalu Linux przy użyciu UTF-8, jak kodowanie, to jest rzeczywiście odczytywane jako sześciu bajtów, które następnie mogą być wykonane wyglądać trzech Unicode znaków za pomocą metody decode
:
>>> 'ª»Ì'
'\xc2\xaa\xc2\xbb\xc3\x8c'
>>> 'ª»Ì'.decode(sys.stdin.encoding)
u'\xaa\xbb\xcc'
Tak, '\xaa\xbb\xcc'
dosłownie ma sens tylko wtedy, gdy ją odszyfrujesz jako łaciński 1 literał (cóż, właściwie możesz użyć innego kodowania, które zgadza się z łacińskim 1 na odpowiednich znakach). Jeśli chodzi o print
"po prostu działa" w twoim przypadku, to na pewno nie dla mnie - jak wspomniano powyżej.
Wynika to z faktu, że podczas korzystania ciąg dosłowny nie poprzedzona u
- tj "asdf"
zamiast u"asdf"
- otrzymany ciąg będzie wykorzystać jakieś kodowanie non-Unicode. Nie; w gruncie rzeczy sam obiekt łańcuchowy będzie kodował - nieświadomy, i będziesz musiał traktować go tak, jakby był zakodowany za pomocą kodowania x, dla poprawnej wartości x. Ta podstawowa idea prowadzi mnie do następującego:
a = '\xAA\xBB\xCC'
a.decode('latin1')
# result: u'\xAA\xBB\xCC'
print(a.decode('latin1'))
# output: ª»Ì
Uwaga brak błędów dekodowania i właściwe wyjście (co spodziewać się zatrzymać właściwy w każdym innym polu). Wygląda na to, że twój literał łańcuchowy może być zrozumiany przez Pythona, ale nie bez pomocy.
Czy to pomaga? (Przynajmniej w zrozumieniu, jak to wszystko działa, jeśli nie czyni obsługę kodowania łatwiejsze ...)
Teraz dla niektórych śmieszne bitów z jakąś wartość wyjaśniającą (miejmy nadzieję)! To działa dobrze dla mnie:
sys.stdout.write("\xAA\xBB\xCC".decode('latin1').encode(sys.stdout.encoding))
Pomijanie części dekodującej lub kodującej powoduje wyjątek związany z unikodem. Teoretycznie rzecz biorąc, ma to sens, ponieważ pierwszy dekoder jest potrzebny, aby zdecydować, jakie znaki występują w danym łańcuchu znaków (jedyne na pierwszy rzut oka oczywiste jest to, że są to: idea Pythona 3 o łańcuchach (unicode) dla znaków i bajtów dla, no, bajtów, nagle wydaje się znakomicie uzasadnione), podczas gdy kodowanie jest potrzebne, aby wyjście respektowało kodowanie strumienia wyjściowego. Teraz to
sys.stdout.write("ąöî\n".decode(sys.stdin.encoding).encode(sys.stdout.encoding))
również działa zgodnie z oczekiwaniami, ale znaki są rzeczywiście pochodzące z klawiaturą i tak są rzeczywiście zakodowane z kodowaniem stdin ... Również
ord('ą'.decode('utf-8').encode('latin2'))
zwraca poprawną 177 (mój kodowanie wejściowe to utf-8), ale "\ xc4 \ x85'.encode (" latin2 ") nie ma sensu dla Pythona, ponieważ nie ma pojęcia, jak rozumieć" \ xc4 \ x85 "i dane, które próbują kod "ascii" jest najlepszy, jaki może zrobić.
Oryginalny odpowiedź:
The relevant bit z docs Pythona (dla wersji 2.6.4) mówi, że print(obj)
jest przeznaczona do wydrukowania napisu podanego przez str(obj)
. Przypuszczam, że można go następnie zawinąć w wywołanie do unicode
(jak w unicode(str(obj))
), aby uzyskać ciąg znaków Unicode - lub można po prostu użyć Python 3 i wymienić tę szczególną uciążliwość na kilka różnych. ;-)
Nawiasem mówiąc, to pokazuje, że można manipulować wynik print
ing obiekt jak można manipulować wynik wywołania str
na obiekcie, który jest brudząc metodą __str__
. Przykład:
class Foo(object):
def __str__(self):
return "I'm a Foo!"
print Foo()
Co do faktycznej realizacji print
oczekuję, to nie będzie przydatna w ogóle, ale jeśli naprawdę chcą wiedzieć, co się dzieje ... To w pliku Python/bltinmodule.c
w Źródła Pythona (szukam wersji 2.6.4). Wyszukaj linię rozpoczynającą się od builtin_print
. W rzeczywistości jest to całkowicie proste, nie ma tam magii.:-)
Mam nadzieję, że to odpowiada na twoje pytanie ... Ale jeśli masz bardziej tajemniczy problem, którego zupełnie mi brakuje, zrób komentarz, zrobię drugą próbę. Ponadto zakładam, że mamy do czynienia z Pythonem 2.x; w przeciwnym razie nie miałbym przydatnego komentarza.
mógłbyś dać nam przykład, czego próbował, co chciałeś/oczekuje się dostać, a co masz? Pomogłoby nam lepiej Ci pomóc. –
Czy pytanie dotyczy Pythona 2 lub 3? –
Ponieważ mówi o "funkcji drukowania", jest to prawdopodobnie Python 3. –