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