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