[python] Exec a unicode problem

Jan Fuchs fuky na sunstel.asu.cas.cz
Čtvrtek Leden 10 15:50:10 CET 2008


Zdravím,
máme skript:

  #!/usr/bin/python
  # -*- coding: utf-8 -*-
  
  def string2hex(string):
    for c in string:
      print "%X" % ord(c)
    print type(string)
    print string
  
  s = u'ž'
  command2 = "string2hex(s)"
  command3 = unicode("string2hex(u'ž')", 'utf-8')
  command4 = "string2hex(unicode('ž', 'utf-8'))"
  command5 = "string2hex(u'\u017e')"
  command6 = "string2hex(unicode('\xc5\xbe', 'utf-8'))"
  command7 = u"string2hex(u'ž')"
  command8 = "string2hex(u'\xc5\xbe')" # error
  #command8 = "string2hex(u'ž')" # error
  
  exec("string2hex(s)")
  exec(command2)
  exec(command3)
  exec(command4)
  exec(command5)
  exec(command6)
  exec(command7)
  exec(command8)

Jeho výstup:

  17E
  <type 'unicode'>
  ž

  ...

  C5
  BE
  <type 'unicode'>
  Traceback (most recent call last):
    File "./u.py", line 26, in ?
      exec(command8)
    File "<string>", line 1, in ?
    File "./u.py", line 8, in string2hex
      print string
    File "/usr/lib/python2.3/encodings/iso8859_2.py", line 18, in encode
      return codecs.charmap_encode(input,errors,encoding_map)
  UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-1: character maps to <undefined>

Až do command8 = "string2hex(u'\xc5\xbe')" je vše v pořádku, vždy je přesně
specifikováno z čeho do čeho probíhá převod. Ale v tomto případě ne, rozhodnutí
se ponechalo na implicitním nastavení tj. 'ascii' a to je chyba.

String "string2hex(u'\xc5\xbe')" se díky '# -*- coding: utf-8 -*-' správně
interpretuje jako utf-8, ale na jeho část "u'\xc5\xbe'" se už toto nastavení
nevztahuje. Jestli se pletu, tak mě opravte.

        S pozdravem Jan Fuchs

http://www.py.cz/PythonUnicodeCestina

09. Jan (Wednesday) v 23:35:00 CET 2008, dmichal na altien.com napsal(a):
> umel by jste mi nekdo vysvetlit proc mi volani exec(script2) hazi
> chybu (UnicodeEncodeError: 'charmap' codec can't encode characters in
> position 0-1: character maps to <undefined>)? A jak to obejit.
> 
> #!/usr/bin/python
> #-*- coding: utf8 -*-
>     
> script2 = "out(u'žlutý kun')"

-- 

/**************************************************************
*   _    Žádný program není bezchybný, dokonalý ani nejlepší, *
*  °v°   to samé platí i o lidech a nejen o nich.             *
* /(_)\                                      -- Jan Fuchs --  *
*  ^ ^                                                        *
*        http://www.fuky.org                 ICQ: 200692177   *
**************************************************************/


Další informace o konferenci Python