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