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

Petr Prikryl PrikrylP na skil.cz
Čtvrtek Říjen 6 08:59:11 CEST 2005


Další poznatky k převodu argv na unicode pod Windows
-- viz dole...

pepr
> > 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č....
> 
> [...] 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() 
[...]
> Nedávno se objevil pokus o implementaci sys.argvu, 
> což měl být ekvivalent sys.argv v unicode [...] smeteno
> ze stolu. [...]

Zeptal jsem se v comp.lang.python (trochu nepřesně, ale
jsou tam chytří hoši): 

What encoding is used when initializing sys.argv?

> I know about the rejected attempt to implement
> sys.argvu. Still, how the sys.argv is filled? What
> encoding is used when parsing the cmd line internally?
> To what encoding is it converted when non ASCII
> characters appear?

Jádro odpovědi je následující:

Martin v. Löwis
> 
> Python does not perform any conversion whatsoever.
> It has a traditional main() function, with the
> char *argv[] argument.
> 
> So if you think that the arguments are inherently
> Unicode on your system, your question should be
> "how does my operating system convert the
> arguments"?
> 
> That, of course, depends on your operating system.
> "MS Windows environment" is not precise enough,
> since it also depends on the specific incarnation
> of that environment. On Windows 9x, I believe the
> command line arguments are "inherently" *not* in
> Unicode, but in a char array. On Windows NT+, they
> are Unicode, and Windows (or is it the MS VC
> runtime?) converts them to characters using the
> CP_ACP code page.

Neil Hodgson:
> 
> Martin mentioned CP_ACP. In Python on Windows,
> this can be accessed as the "mbcs" codec.
> 
> import sys
> print repr(sys.argv[1])
> print repr(unicode(sys.argv[1], "mbcs"))
> 
> C:\bin>python glurp.py abcß*
> 'abc\xdf\x95'
> u'abc\xdf\u2022'

Takže úprava tvého skriptu (geon) by mohla vypadat 
takto: 
     cesta = unicode(sys.argv[1], "mbcs")


pepr



Další informace o konferenci Python