[python] Tisk unicode řetězce a tisk seznamu unicode řetězců

Petr Messner petr.messner na gmail.com
Úterý Červen 7 10:29:41 CEST 2011


Ahoj,

klíč je v tomhle:

>>> print "kůň"
kůň
>>> print repr("kůň")
'k\xc5\xaf\xc5\x88'

Funkce repr vypíše řetězec (nebo cokoliv jiného) tak, aby bylo jasné,
z čeho se skládá. Všechny znaky mimo ASCII písmen, čísel a pár dalších
je tedy vypsáno v hexadecimální podobě. Při print "kůň" se toto ale
neděje a řetězec je vypsán tak jak je.

Když si třeba přes open("obrazek.jpg").read() načtu nějaký binární
bordel, který by mi při vypsání printem rozhodil terminál, můžu použít
repr() a uvidím i nezobrazitelné znaky.

Pokud chceš vypsat list (print [...]), pak se pro jednotlivé položky
listu použije repr, protože tak to list prostě dělá. str(list) se
prostě chová tak, že to mezi dvě hranaté závorky dá repr() všech
položek v tom listu.

BTW. str() a repr() jen volají metody __str__ a __repr__ daného
objektu, takže každý objekt si sám rozhoduje, jak se nechá vypsat.
Tyto metody můžeš implementovat i ve svých objektech.

Ještě bych chtěl upozornit, že pracuješ s "obyčejnými" řetězci, takže
Python neví, že "ň" je n s háčkem - pro Python jsou to jen dva bajty
0xC5 0x88, které shodou okolnosí tvoje konzole fungující v utf-8
vypíše jako ň. Pro přeložení str do unicode slouží metoda decode,
encode je pro opačný směr:

>>> print repr("kůň")
'k\xc5\xaf\xc5\x88'
>>> print repr("kůň".decode("utf-8"))
u'k\u016f\u0148'
>>> print "kůň".decode("utf-8")
kůň

A nakonec, pokud chceš vypsat položky listu jako řetězce, dá se použít str.join:

>>> print ", ".join(["žlutý", "kůň"])
žlutý, kůň

Snad jsem ti aspoň v něčem pomohl. Pochopení kódování a unicode je
docela klíčové, přidám ještě pár odkazů:

http://www.joelonsoftware.com/articles/Unicode.html - The Absolute
Minimum Every Software Developer Absolutely, Positively Must Know
About Unicode and Character Sets (No Excuses!) by Joel Spolsky

http://docs.python.org/howto/unicode.html - Unicode HOWTO

http://farmdev.com/talks/unicode/ - Unicode In Python, Completely
Demystified (prezentace)

http://stackoverflow.com/questions/1436703/difference-between-str-and-repr-in-python
- Difference between __str__ and __repr__ in Python

Petr Messner


2011/6/7 David Rohleder <davro na ics.muni.cz>:
> Ahoj,
>
> neví někdo, proč se následující příklad chová následovně?
>
> #!/usr/bin/env python
> # -*- coding: utf-8 -*-
>
> seznam = [ "žluťoučký kůň", "úpěl ďábelské ódy" ]
>
> print seznam
>
> for i in seznam:
>    print i
>
>
> ['\xc5\xbelu\xc5\xa5ou\xc4\x8dk\xc3\xbd k\xc5\xaf\xc5\x88', '\xc3\xbap
> \xc4\x9bl \xc4\x8f\xc3\xa1belsk\xc3\xa9 \xc3\xb3dy']
> žluťoučký kůň
> úpěl ďábelské ódy
>
> Tj. jednou to vytiskne dost nečitelně a podruhé správně čitelně (oboje
> je asi správně)?
>
> zkoušel jsem třeba i
>
> print [i.encode("utf-8") for i in seznam]
>
> ale taky nic.
>
> Dík
>
> David
>
>
> --
> ------------------------------------------------------------------------
> David Rohleder                                         davro na ics.muni.cz
> Institute of Computer Science, Masaryk University
> Brno, Czech Republic
> ------------------------------------------------------------------------
>
>
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python
>


Další informace o konferenci Python