[python] cestina a python
Petr Prikryl
Prikryl na skil.cz
Pátek Duben 15 08:53:09 CEST 2005
Ivo Štolpa napsal
> Nevím, jestli je to ono, protože já to ještě
> nepotřeboval, ale v dokumentaci se píše
> o raw-unicode-escape. Tedy místo u"text" se píše
> ur"text". A taky to prý jde překódovávat něco
> jako t = s.encode('raw-unicode-escape') nebo
> t = s.encode('unicode-escape').
Asi to s tím nemá nic společného. Slovo "raw"
znamená "surový", "nezpracovaný". Identifikátor
raw_input() znamená, že se zadaný vstup nijak
nezpracovává (nepřevádí se například na číslo,
jako je tomu u input()). Pojem "raw string"
vyjadřuje skutečnost, že se se zapsaným obsahem
nic nedělá. Konkrétně to znamená, že se
neinterpretují sekvence pro vložení konců řádků
tabulátorů a další, které se běžně zapisují
"\t\n\a...".
Raw stringy se používají i v neunicodových
řetězcích. Zmíněná poznámka souvisí s tím,
že i při zápisu unicode řetězů mohu předepsat,
že se nemají interpretovat takzvané escape
sekvence. To znamená, že například sekvence
"\t" není nahrazena znakem s ordinální hodnotou 9,
ale zůstane přítomna jako dvojice znaků "\" a "t".
Speciální značky při zápisu řetězce (jako je u a r
před úvozovkami) říkají jen to, co se má udělat
při převodu zdrojového textu do paměťové reprezentace.
Buď vznikne posloupnost bajtů, které lze chápat
jako řetězec v předem dohodnutém kódování, nebo
vznikne unicode řetězec. Zpětně se už nedá zjistit,
zda bylo předepsáno "raw".
Zpět k uvedenému problému s češtinou. Příklad můžu
přepsat i bez unicode a provádět konverzi sám:
# -*- coding: cp1250 -*-
import sys
s = u'příšerně žluťoučký kůň úpěl ďábelské ódy'
print s.encode('cp852')
sys.stdout.write(s.encode('cp852') + '\n')
val = raw_input(s.encode('cp852'))
Pokud v tomto případě spouštím skript v dosovém
okně českých Windows, pak se unicode konvertuje
do kódování 852 a vše je v pořádku. Problém spočívá
v tom, že se takhle obtížně píše přenositelný
program v tom smyslu, aby korektně vypisoval české
texty v konzolovém pod Linuxem, v konzolovém okně
pod Windows, v jiném GUI okně, které může (typicky
ve Windows) používat jiné kódování, atd.
V návrhu Python 3.0 (viz
http://www.python.org/peps/pep-3000.html) se říká,
že řetězce budou používat výhradně unicode. Pro
posloupnost bajtů bude zaveden nový typ bytes().
Pokud v současném Pythonu nepoužíváme zápis
u'text', pak vlastně do vnitřní reprezentace
ukládáme posloupnost bajtů, aniž by byla zachycena
informace o použitém kódování. Za běhu už se to
pak nedá zjistit. Musíme to _vědět_ a podle potřeby
provádět případné konverze. Dělá se to obtížně
zvláště tehdy, když používáme různé moduly
a nemáme vše pod vlastní kontrolou. Proto je důležité,
aby vše unicodové v Pythonu fungovalo.
Petr
P.S. V bug listu jsem uvedené chybě zvýšil prioritu,
viz [ 1099364 ] raw_input() displays wrong unicode prompt
https://sourceforge.net/tracker/index.php?func=detail&aid=1099364&group_id=5470&atid=105470
Další informace o konferenci Python