[python] Tisk unicode řetězce a tisk seznamu unicode řetězců
Petr Přikryl
prikryl na atlas.cz
Středa Červen 8 09:24:58 CEST 2011
> "David Rohleder" píše
[...]
> Když už jsme u těch řetězců: jak se udělá raw unicode řetězec, tj.
> interpret neinterpretuje uvnitř? Generuju si latexový dokument a on se
> přirozeně vzteká na:
>
> hlavicka = ur"""
> documentclass[a4,landscape]{article}
> usepackage{graphicx}
> usepackage[czech]{babel}
> usepackage[utf8]{inputenc}
> begin{document}
> thispagestyle{empty}
> """
>
> print hlavicka
>
> SyntaxError: (unicode error) 'rawunicodeescape' codec can't decode bytes
> in position 39-40: truncated uXXXX
To je jedno z těch temných zákoutí. Ono se to vzteká už při
hlavicka = ur'usepackage'
print hlavicka
Problém je v tom, že raw-unicode-escape s předponou ur není tak úplně 'raw'.
Interpretují se posloupnosti uXXXX -- viz
http://docs.python.org/tutorial/introduction.html#unicode-strings:
"For experts, there is also a raw mode just like the one
for normal strings. You have to prefix the opening quote
with ‘ur’ to have Python use the Raw-Unicode-Escape encoding.
It will only apply the above uXXXX conversion if there is an uneven
number of backslashes in front of the small ‘u’."
V tomto případě mě napadá jen ta možnost, že se napřed vyrobí
raw string (starý, neunicode) a převede se druhým krokem
na unicode:
==============================
# -*- coding: utf-8 -*-
hlav = r"""
documentclass[a4,landscape]{article}
usepackage{graphicx}
usepackage[czech]{babel}
usepackage[utf8]{inputenc}
begin{document}
thispagestyle{empty}
"""
print type(hlav)
hlavicka = unicode(hlav, 'utf-8')
print type(hlavicka)
print hlavicka
==============================
Dá se to trochu vylepšit tím, že si nadefinuješ funkci u(), aby se
to hezčeji zapislovalo:
==============================
# -*- coding: utf-8 -*-
def u(raw_string, encoding='utf-8'):
return unicode(raw_string, encoding)
hlavicka = u(r"""
documentclass[a4,landscape]{article}
usepackage{graphicx}
usepackage[czech]{babel}
usepackage[utf8]{inputenc}
begin{document}
thispagestyle{empty}
""")
print type(hlavicka)
print hlavicka
==============================
V případě chroupání LaTeXových textů bych ale vážně uvažoval
o použití Python 3 -- i kdyby jen pro tento účel. Tam se z toho
stane jen raw string, který bude automaticky unicode (nový str
se rovná starému typu unicode):
==============================
# -*- coding: utf-8 -*-
hlavicka = r"""
documentclass[a4,landscape]{article}
usepackage{graphicx}
usepackage[czech]{babel}
usepackage[utf8]{inputenc}
begin{document}
thispagestyle{empty}
"""
print(type(hlavicka))
print(hlavicka)
==============================
Pokud toho chroustacího kódu máš víc, pomůže pythonovská
utilitka 2to3 -- viz http://diveintopython3.py.cz/case-study-porting-chardet-to-python-3.html#running2to3
P.
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://www.py.cz/pipermail/python/attachments/20110608/8ae63fd2/attachment.html>
Další informace o konferenci Python