Topic: strano problema di codifica  (Letto 3255 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline gigi2

  • python unicellularis
  • *
  • Post: 28
  • Punti reputazione: 1
    • Mostra profilo
strano problema di codifica
« il: Settembre 06, 2010, 11:57 »
ciao a tutti.
ci dev'essere qualcosa di grosso che mi sfugge. Oppure c'è un bug nella libreria standard. Ma voglio credere nella prima ipotesi.

guardate qua:

Python 2.6.5 (release26-maint, Aug 16 2010, 09:25:14)
[GCC 4.3.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from xml.dom.minidom import parseString
>>> parseString(u'<tag>è</tag>')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/site-packages/_xmlplus/dom/minidom.py", line 1925, in parseString
    return expatbuilder.parseString(string)
  File "/usr/lib/python2.6/site-packages/_xmlplus/dom/expatbuilder.py", line 942, in parseString
    return builder.parseString(string)
  File "/usr/lib/python2.6/site-packages/_xmlplus/dom/expatbuilder.py", line 223, in parseString
    parser.Parse(string, True)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe8' in position 5: ordinal not in range(128)

io sto passando a xml.dom.minidom.parseString una stringa unicode, in modo da non dovergli dire la codifica e poter evitare di aggiunge l'intestazione xml <?xml version="1.0" encoding="utf-8"?>. Ma perchè diavolo vuole codificarla? parseString in python3 la ingoia senza problemi.

illuminatemi!

Offline Markon

  • python sapiens sapiens
  • *
  • moderatore
  • Post: 4.104
  • Punti reputazione: 5
    • Mostra profilo
    • Neolithic
Re: strano problema di codifica
« Risposta #1 il: Settembre 06, 2010, 12:06 »
Ciao!

Cercando nel forum puoi trovare risposte alla tua domanda. Esempio:

http://www.python-it.org/forum/index.php?topic=621.0 <-- consigliato!
http://www.python-it.org/forum/index.php?topic=2358.0
http://www.python-it.org/forum/index.php?topic=3584.0

Usando il consiglio di Wolf ho fatto così:
[hlpycode]from xml.dom.minidom import parseString
char = 'è'.decode('utf-8')
parseString(u'<tag>%s</tag>' %char.encode('utf-8'))[/hlpycode]
« Ultima modifica: Settembre 06, 2010, 12:14 da Markon »

Offline gigi2

  • python unicellularis
  • *
  • Post: 28
  • Punti reputazione: 1
    • Mostra profilo
Re: strano problema di codifica
« Risposta #2 il: Settembre 06, 2010, 12:15 »
beh, il giro dall' iso-8859-1 non è necessario.
la mia domanda viene dal fatto che parseString non accetta unicode come (credo) dovrebbe. C'è una ragione?

Offline Bakuriu

  • python sapiens sapiens
  • ******
  • Post: 2.267
  • Punti reputazione: 2
  • Katon, Goukakyuu no jutsu!
    • Mostra profilo
    • Jack's Blackboard - Il mio blog
Re: strano problema di codifica
« Risposta #3 il: Settembre 07, 2010, 09:37 »
Dove sta scritto che parseString supporta le stringhe unicode?
Io qui non lo trovo.

Se leggi la doc capisci che parseString è implementato in questo modo:
[hlpycode]
from StringIO import StringIO

def parseString(text):
    fobj = StringIO(text)
    parse(fobj)
[/hlpycode]

Sicuramente il problema stà nella trasformazione da stringa a StringIO:
[hlpycode]>>> from StringIO import StringIO
>>> fobj = StringIO(u'<tag>è</tag>')
>>> for x in fobj:
...     print x,
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 5-6: ordinal not in range(128)
>>> fobj.seek(0)
>>> t = fobj.read()
>>> t
u'<tag>\xc3\xa8</tag>'
>>> print t
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 5-6: ordinal not in range(128)
>>> print t.encode('utf-8')
<tag>è</tag>   #<-- non c'è più la "è"...
[/hlpycode]

Usando gli escape invece funziona:
[hlpycode]>>> print StringIO(u'<tag>\xe8</tag>').read().encode('utf-8')
<tag>è</tag>     #la "è" è rimasta.
[/hlpycode]