[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