RE: [python] Detekce kodovani zadaneho vstupu (bylo RE: soubor v jiné zankové sadě)

Petr Prikryl PrikrylP na skil.cz
Pátek Září 30 13:10:05 CEST 2005


Opravuji svou reakci na

> geon
> > pepr
> > >    cesta = unicode(raw_input(), sys.stdin.encoding)
> > když to udělám takto, tak mi to nefunguje (v DOSU). Píše to :
> > C:\Admin\update>deltree_xp.py c:\ěščřžýáí
> > Traceback (most recent call last):
> >   File "C:\Admin\update\deltree_xp.py", line 36, in ?
> > [...]
> > WindowsError: [Errno 3] SystÚm nem¨×e nalÚzt uvedenou cestu: 
> > u'c:\\\xfd\xdc\u0154\xb0\xd7\u0159\xdf\xdd/*.*'
> > 
> > Když tam ale natvrdo dám místo sys.stdin.encoding --- 
> > "cp1250", tak to jede bez problémů...nevím proč....

... to jsem se spletl. Nevšiml jsem si, že se adresář
zadává z příkazového řádku. Souvisí to s načítáním argv 
a unicode. V tomto případě asi Python předpokládá, že
se mu informace z příkazové řádky dostane v podobě 
dodané systémem (abstrakce nezávislá na tom, jakým 
způsobem se to zadalo). Asi v tom budou nějaké nejasnosti,
ale vypadá to, že v tomto případě se při načítání argv
bude vnitřně používat kódování, které můžu zjistit
voláním sys.getdefaultencoding() (nemám teď po ruce 
zdrojáky). Zkus:

c.py
==================================================
import sys

print 'cp1250:', unicode(sys.argv[1], 'cp1250')
print 'cp852:', unicode(sys.argv[1], 'cp852')
print 'stdin.enc:', unicode(sys.argv[1], sys.stdin.encoding)
print 'default enc.:', unicode(sys.argv[1], sys.getdefaultencoding())
raw_input('...')
==================================================

Zadej "python c.py ěščřžýá" v DOSovém okně
a pak zkus vytvořit zástupce (Shortcut) na c.py
a uprav jej tak, aby pracovní adresář ukazoval
ke skriptu a spouštěl se ".../python.exe c.py ěščřžýá".
Poslední příkaz je brzda, aby se okénko nezavřelo.

Nedávno se objevil pokus o implementaci sys.argvu, 
což měl být ekvivalent sys.argv v unicode. Jenže 
se objevily komplikace a nakonec to bylo smeteno
ze stolu. Zmiňuje se o tom i níže zmíněná diskuse
v comp.lang.python, která uvádí alternativní způsob
získání argumentů z příkazové řádky v unicode:

http://groups.google.com/group/comp.lang.python/browse_thread/thread/22bcdd80266c6b68/5ed8287c40c79e10?lnk=st&q=python+argv+unicode&rnum=1#5ed8287c40c79e10

(tj. google ve skupinách na "python argv unicode")

Jádro otázky a odpovědi:
----------------------------------------------
Jakob Simon-Gaarde: 
> How can I ensure a safe passing of arguments maybe having speciel 
> characters within. 

    Use ctypes to call the Windows GetCommandLine function. The 
CommandLineToArgvW function can be used to break up the command line 
string into arguments. 
----------------------------------------------

Nemám s tím modulem žádné zkušenosti, ale třeba
se někdo ozve ;-)




Další informace o konferenci Python