Discussion:
Hola Mundo. -- Error a Ingresar ñ
(too old to reply)
Carlos Do Carmo
2008-08-06 14:26:45 UTC
Permalink
Hola Mundo.

Buenas como están?

Este es primer mail que envió a la lista, me llamo Carlos Do Carmo, soy de
Salto, Uruguay.

Soy nuevo con Python, estoy desarrollando una aplicación con python, wx con
Boa Constructor, el problema que tengo es que al ingresar una palabra con
"ñ" en un wx.TextCtrl, me da error "'ascii' codec can't encode character
u'\xf1....."

debe de tener una solución simple, pero no la sé. Me pueden indicar como
solucionar este problema

saludos

Carlos Do Carmo
Matigro
2008-08-06 15:50:29 UTC
Permalink
Post by Carlos Do Carmo
Hola Mundo.
Buenas como están?
Este es primer mail que envió a la lista, me llamo Carlos Do Carmo, soy de
Salto, Uruguay.
Buenas, ¡bienvenido Carlos a esta lista!
Post by Carlos Do Carmo
el problema que tengo es que al ingresar una palabra con
"ñ" en un wx.TextCtrl, me da error "'ascii' codec can't encode character
u'\xf1....."
ingresá el valor con una u'' adelante. Ej: print(u'Cañazo') con eso debería
estar.
saludos

Carlos Do Carmo

Salute, Matías
p/d: hice el ejemplo en el editor interactivo, y resulta que en la version
2.5.2 imprime sin dramas el unicode.
Pablo Ziliani
2008-08-06 16:06:13 UTC
Permalink
Hola Carlos, bienvenido a PyAr.
Post by Carlos Do Carmo
Hola Mundo.
Buenas como están?
Bien por suerte, la familia bien, el perro bien :)
Post by Carlos Do Carmo
el problema que tengo es que al ingresar una palabra con
"ñ" en un wx.TextCtrl, me da error "'ascii' codec can't encode character
u'\xf1....."
ingresá el valor con una u'' adelante. Ej: print(u'Cañazo') con eso
debería estar.
saludos
Carlos Do Carmo
Salute, Matías
p/d: hice el ejemplo en el editor interactivo, y resulta que en la
version 2.5.2 imprime sin dramas el unicode.
No, eso no necesariamente garantiza que funcione. De hecho,
probablemente no lo haga en su sistema (fuera del intérprete interactivo).
Lo que tendrías que hacer es decirle a Python como interpretar los bytes
de tu archivo. La u'' adelante no alcanza para eso. El PEP 263[1]
explicac como declarar el encoding de un archivo, básicamente tenés que
comenzar tu script de la siguiente manera (en el caso de que uses utf-8)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

(la linea relevante es la segunda)

Ojo, lo que tenés que poner ahí es el encoding en el que estés
escribiendo (típicamente manejado por el editor, o por el sistema), no
lo que "querrías" que quede.

Saludos,
Pablo

[1] http://www.python.org/dev/peps/pep-0263/
Matigro
2008-08-06 16:09:45 UTC
Permalink
Post by Pablo Ziliani
Hola Carlos, bienvenido a PyAr.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
Pablo
[1] http://www.python.org/dev/peps/pep-0263/
¡Pero claro Hombre! se me chispotió esa solución, y justo esa que ES la
respuesta.

Salute
Pablo Ziliani
2008-08-06 16:38:46 UTC
Permalink
Post by Pablo Ziliani
Hola Carlos, bienvenido a PyAr.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
Pablo
[1] http://www.python.org/dev/peps/pep-0263/
¡Pero claro Hombre! se me chispotió esa solución, y justo esa que ES
la respuesta.
De hecho creo que no (oops, I did it again)...

No me di cuenta que quizás el problema de Carlos esté del lado de la
entrada de datos del usuario (no conozco wx pero podría asumir que
wx.TextCtrl es algúna clase de input).

Yo no sé cómo toma el dato el control, si lo hace diréctamente en
Unicode, quizás haya alguna forma de específicarle el encoding default
(quizás es a nivel aplicación). Si lo hace como string, entonces tenés
que decodificarlo "a mano" (algo como entrada.decode('utf-8')).
Probablemente otra persona más ducha con wx pueda responder mejor que yo.

Quizás tengas que configurar el encoding global con sitecustomize.py,
pero no sé si es una buena práctica. Dive into Python[1] tiene un
capítulo bastante interesante acerca de Unicode, quizás valga la pena
que le des un vistazo.

[1] http://diveintopython.org/xml_processing/unicode.html
Facundo Batista
2008-08-06 16:36:36 UTC
Permalink
Post by Carlos Do Carmo
Soy nuevo con Python, estoy desarrollando una aplicación con python, wx con
Boa Constructor, el problema que tengo es que al ingresar una palabra con
"ñ" en un wx.TextCtrl, me da error "'ascii' codec can't encode character
u'\xf1....."
¿Dónde ingresás la "ñ"? ¿En el código al escribir el programa o en una
ventanita que te aparece cuando ejecutás tu programa?

Si copiás acá exactamente el error que te da, también ayudará a
encontrar el problema.

Slds.
--
. Facundo

Blog: http://www.taniquetil.com.ar/plog/
PyAr: http://www.python.org/ar/
Carlos Do Carmo
2008-08-06 16:43:38 UTC
Permalink
¿Dónde ingresás la "ñ"? ¿En el código al escribir el programa o en una
ventanita que te aparece cuando ejecutás tu programa?

Si copiás acá exactamente el error que te da, también ayudará a
encontrar el problema.

Slds.
--
. Facundo

Blog: http://www.taniquetil.com.ar/plog/
PyAr: http://www.python.org/ar/

---------------------------------------------------------------------

Ingreso en la ventana, en cualquiera de los campos. Son wx.TextCtrl

El error es " 'ascii' codec can't encode character u'\xf1' in position 111:
ordinal not in range(128)"

# -*- coding: utf-8 -*- lo ingrese en el script donde está la ventana, no
funciona, también en el script BoaApp, y me sigue dando el error

Carlos Do Carmo
Facundo Batista
2008-08-06 17:21:11 UTC
Permalink
El día 6 de agosto de 2008 13:43, Carlos Do Carmo
Post by Carlos Do Carmo
Ingreso en la ventana, en cualquiera de los campos. Son wx.TextCtrl
¿En la ventana de tu programa funcionando? Asumo que sí.
Post by Carlos Do Carmo
ordinal not in range(128)"
¿El programa se corta cuando tenés este error? ¿O es algo que sale por
el stdout pero sigue el programa funcionando?

Si se corta, deberías tener un traceback, por favor copiá acá todo,
desde el "Traceback..." hasta el final.

Slds.
--
. Facundo

Blog: http://www.taniquetil.com.ar/plog/
PyAr: http://www.python.org/ar/
Carlos Do Carmo
2008-08-06 19:31:01 UTC
Permalink
Post by Facundo Batista
El día 6 de agosto de 2008 13:43, Carlos Do Carmo
Post by Carlos Do Carmo
Ingreso en la ventana, en cualquiera de los campos. Son wx.TextCtrl
¿En la ventana de tu programa funcionando? Asumo que sí.
Si esta funcionando,
Post by Facundo Batista
Post by Carlos Do Carmo
ordinal not in range(128)"
¿El programa se corta cuando tenés este error? ¿O es algo que sale por
el stdout pero sigue el programa funcionando?
Si se corta, deberías tener un traceback, por favor copiá acá todo,
desde el "Traceback..." hasta el final.
Slds.
Traceback (most recent call last):
File "D:\SistemaRest\Localidad.py", line 147, in OnGuardarButton
self.guardar_Loc()
File "D:\SistemaRest\Localidad.py", line 180, in guardar_Loc
print sql
UnicodeEncodeError: 'ascii' codec can't encode characters in position
70-71: ordinal not in range(128)


en el sql le paso esto

sql = "INSERT into localidad (loc_Pais,loc_Ciudad,loc_CodPostal)
Values ('%s','%s','%s') " % \
(self.Pais.GetValue(),\
self.Ciudad.GetValue(),\
self.CodPostal.GetValue())
Pablo Ziliani
2008-08-06 20:08:25 UTC
Permalink
Post by Carlos Do Carmo
Post by Facundo Batista
Si se corta, deberías tener un traceback, por favor copiá acá todo,
desde el "Traceback..." hasta el final.
File "D:\SistemaRest\Localidad.py", line 147, in OnGuardarButton
self.guardar_Loc()
File "D:\SistemaRest\Localidad.py", line 180, in guardar_Loc
print sql
UnicodeEncodeError: 'ascii' codec can't encode characters in position
70-71: ordinal not in range(128)
en el sql le paso esto
sql = "INSERT into localidad
(loc_Pais,loc_Ciudad,loc_CodPostal) Values ('%s','%s','%s') " % \
(self.Pais.GetValue(),\
self.Ciudad.GetValue(),\
self.CodPostal.GetValue())
Más allá de que es imposible de determinar si ese es o no el código que
causa el error (si no podés poner todo el script al menos mandá una
versión reducida que reproduzca el error), siempre te conviene dejarle
el type-checking al conector y pasar los parámetros por separado (aunque
que puedas va a depender de lo que estés usando para conectarte):

sql = "INSERT into localidad (loc_Pais,loc_Ciudad,loc_CodPostal) Values
(%s, %s, %s)"
resultado = connection.Execute(sql, (self.Pais.GetValue(),
self.Ciudad.GetValue(), self.CodPostal.GetValue()))

Puede ser que tengas que cambiar los "%s" por "?".

No sé si eso va a alcanzar para resolver el problema de unicode, no
estoy muy ducho en el tema DB.

Te tiro algunas puntas que yo probaría:
¿qué tipo devuelven los GetValue() ? Si te comunicás con la base de
datos en algún encoding específico, quizás tengas que pasar así los
valores (caso utf-8):

self.Ciudad.GetValue().encode('utf-8')

si la conexión se banca unicode, probaría pasando todo a unicode
(u"INSERT into localidad ...")

Saludos,
Pablo
Carlos Do Carmo
2008-08-06 20:33:57 UTC
Permalink
Post by Pablo Ziliani
Post by Carlos Do Carmo
Post by Facundo Batista
Si se corta, deberías tener un traceback, por favor copiá acá todo,
desde el "Traceback..." hasta el final.
File "D:\SistemaRest\Localidad.py", line 147, in OnGuardarButton
self.guardar_Loc()
File "D:\SistemaRest\Localidad.py", line 180, in guardar_Loc
print sql
UnicodeEncodeError: 'ascii' codec can't encode characters in position
70-71: ordinal not in range(128)
en el sql le paso esto
sql = "INSERT into localidad
(loc_Pais,loc_Ciudad,loc_CodPostal) Values ('%s','%s','%s') " % \
(self.Pais.GetValue(),\
self.Ciudad.GetValue(),\
self.CodPostal.GetValue())
Más allá de que es imposible de determinar si ese es o no el código
que causa el error (si no podés poner todo el script al menos mandá
una versión reducida que reproduzca el error), siempre te conviene
dejarle el type-checking al conector y pasar los parámetros por
separado (aunque que puedas va a depender de lo que estés usando para
sql = "INSERT into localidad (loc_Pais,loc_Ciudad,loc_CodPostal)
Values (%s, %s, %s)"
resultado = connection.Execute(sql, (self.Pais.GetValue(),
self.Ciudad.GetValue(), self.CodPostal.GetValue()))
Puede ser que tengas que cambiar los "%s" por "?".
No sé si eso va a alcanzar para resolver el problema de unicode, no
estoy muy ducho en el tema DB.
¿qué tipo devuelven los GetValue() ? Si te comunicás con la base de
datos en algún encoding específico, quizás tengas que pasar así los
self.Ciudad.GetValue().encode('utf-8')
Pablo.
probé hacer como dices y funciono, me guarda, por ejemplo "españa" la
guarda de esta manera "españa", si intento hacer un respaldo de la db
me lo genera asi ( el respaldo lo realize sin querer y me salio asi)
INSERT INTO `localidad` (loc_Nro, loc_Pais, loc_Ciudad, loc_CodPostal)
VALUES (3, 'españa', 'weq', '33');

pero si lo muestro en el sistema sale asi. "españa"

para mostrar realizo lo siguiente

sql = "SELECT * FROM localidad order by loc_Pais,loc_Ciudad"
resultados = SettingsDB.consulta(sql)

for i, Loc in enumerate(resultados):
self.Localidades.SetCellValue(i, 0, str(Loc['loc_Ciudad']))
self.Localidades.SetCellValue(i, 1, (Loc['loc_Pais']))
self.Localidades.SetCellValue(i, 2, str(Loc['loc_CodPostal']))
self.Localidades.SetRowLabelValue(i, str(Loc['loc_Nro']))



def consulta(consulta):
db=MySQLdb.connect(host=host,user=user,passwd=passwd,db=db_name)
con=db.cursor()
con.execute(consulta)
return con.fetchall()
Post by Pablo Ziliani
si la conexión se banca unicode, probaría pasando todo a unicode
(u"INSERT into localidad ...")
Saludos,
Pablo
---------------------------------------------------------------------
PyAr - Python Argentina - Sitio web: http://www.python.com.ar/
Yaco
2008-08-06 21:01:31 UTC
Permalink
Post by Carlos Do Carmo
probé hacer como dices y funciono, me guarda, por ejemplo "españa" la
guarda de esta manera "españa", si intento hacer un respaldo de la db
me lo genera asi ( el respaldo lo realize sin querer y me salio asi)
INSERT INTO `localidad` (loc_Nro, loc_Pais, loc_Ciudad, loc_CodPostal)
VALUES (3, 'españa', 'weq', '33');
pero si lo muestro en el sistema sale asi. "españa"
bienvenido a la pesadilla de los encodings!

tengo la teoría de que si el inglés usara acentos[1] todos los programadores del
resto del mundo tendríamos un 30% menos de trabajo ingrato.

[1] en realidad, el inglés usa acentos en palabras foráneas (ej: 'résumé') y en
algunos casos extraños en palabras propias del inglés, y en formas poéticas.

yaco\
--
música es silencio vestido.
http://yaco.net/
Carlos Do Carmo
2008-08-06 21:12:06 UTC
Permalink
Post by Yaco
Post by Carlos Do Carmo
probé hacer como dices y funciono, me guarda, por ejemplo "españa"
la guarda de esta manera "españa", si intento hacer un respaldo de
la db me lo genera asi ( el respaldo lo realize sin querer y me salio
asi) INSERT INTO `localidad` (loc_Nro, loc_Pais, loc_Ciudad,
loc_CodPostal) VALUES (3, 'españa', 'weq', '33');
pero si lo muestro en el sistema sale asi. "españa"
bienvenido a la pesadilla de los encodings!
tengo la teoría de que si el inglés usara acentos[1] todos los
programadores del resto del mundo tendríamos un 30% menos de trabajo
ingrato.
'résumé') y en algunos casos extraños en palabras propias del inglés,
y en formas poéticas.
yaco\
Funciona al Guardar..

sql = "INSERT into localidad (loc_Pais,loc_Ciudad,loc_CodPostal)
Values ('%s','%s','%s') " % \
(self.Pais.GetValue().encode('latin-1') ,\
self.Ciudad.GetValue().encode('latin-1') ,\
self.CodPostal.GetValue().encode('latin-1') )

SettingsDB.executar(None, sql)


def executar(self,sql):
c2.execute(sql)

return ""


Ahora estoy teniendo problemas al modificar. :-)


def modificar_Loc(self):

tabla = "localidad"
campos = " loc_Pais = '%s', loc_Ciudad = '%s', loc_CodPostal =
'%s'" %
((self.Pais.GetValue()),str(self.Ciudad.GetValue()),str(self.CodPostal.GetValue()))

condicion = "loc_Nro= '%s'" % (self.Localidad)


SettingsDB.Modificar(self,tabla,campos,condicion)



def Modificar(self,tabla,campos,condicion):
db=MySQLdb.connect(host=host,user=user,passwd=passwd,db=db_name)
c=db.cursor()

sql ="UPDATE %s SET %s WHERE %s" % (tabla,campos,condicion)


c.execute(sql)

c.close()
return
Nicolas Echaniz
2008-08-07 04:03:23 UTC
Permalink
estoy un poco dormido, pero...
Post by Carlos Do Carmo
Values ('%s','%s','%s') " % \
(self.Pais.GetValue().encode('latin-1') ,\
self.Ciudad.GetValue().encode('latin-1') ,\
self.CodPostal.GetValue().encode('latin-1') )
Por qué acá no hacés lo mismo?
Post by Carlos Do Carmo
campos = " loc_Pais = '%s', loc_Ciudad = '%s', loc_CodPostal =
'%s'" %
((self.Pais.GetValue()),str(self.Ciudad.GetValue()),str(self.CodPostal.GetV
alue()))
por qué no usás el .encode("latin-1") en estos GetValue() ?
Carlos Do Carmo
2008-08-07 13:53:18 UTC
Permalink
Post by Nicolas Echaniz
estoy un poco dormido, pero...
Post by Carlos Do Carmo
Values ('%s','%s','%s') " % \
(self.Pais.GetValue().encode('latin-1') ,\
self.Ciudad.GetValue().encode('latin-1') ,\
self.CodPostal.GetValue().encode('latin-1') )
Por qué acá no hacés lo mismo?
Post by Carlos Do Carmo
campos = " loc_Pais = '%s', loc_Ciudad = '%s', loc_CodPostal =
'%s'" %
((self.Pais.GetValue()),str(self.Ciudad.GetValue()),str(self.CodPostal.GetV
alue()))
por qué no usás el .encode("latin-1") en estos GetValue() ?
Nicolas.

Cuando mande el mail con ese código había sacado
.encode("latin-1") , para probar, pero ya había probado con
.encode("latin-1"), lo que voy a probar ahora es hacer de la misma
manera que el insert,.
Carlos Do Carmo
2008-08-07 14:33:58 UTC
Permalink
Post by Carlos Do Carmo
Post by Nicolas Echaniz
estoy un poco dormido, pero...
Post by Carlos Do Carmo
Values ('%s','%s','%s') " % \
(self.Pais.GetValue().encode('latin-1') ,\
self.Ciudad.GetValue().encode('latin-1') ,\
self.CodPostal.GetValue().encode('latin-1') )
Por qué acá no hacés lo mismo?
Post by Carlos Do Carmo
campos = " loc_Pais = '%s', loc_Ciudad = '%s', loc_CodPostal =
'%s'" %
((self.Pais.GetValue()),str(self.Ciudad.GetValue()),str(self.CodPostal.GetV
alue()))
por qué no usás el .encode("latin-1") en estos GetValue() ?
Nicolas.
Cuando mande el mail con ese código había sacado
.encode("latin-1") , para probar, pero ya había probado con
.encode("latin-1"), lo que voy a probar ahora es hacer de la misma
manera que el insert,.
---------------------------------------------------------------------
PyAr - Python Argentina - Sitio web: http://www.python.com.ar/
El error no es al tratar de realizar el update en la base de datos, me
da cuando asigno la sentencia a un string

sql = "UPDATE localidad SET loc_Pais = '" +
self.Pais.GetValue().encode('latin-1') +" ', loc_Ciudad = '" +
self.Pais.GetValue().encode('latin-1') + "', loc_CodPostal = '"+
self.Pais.GetValue().encode('latin-1') +"' WHERE loc_Nro= " +
self.Localidad

ahi es donde cae, probe hacer asi para ver que me mostraba, si alguno de
los atributos no tiene una "ñ"

me imprime asi

"UPDATE localidad SET loc_Pais = 'ddrr ', loc_Ciudad = 'ddrr',
loc_CodPostal = 'ddrr' WHERE loc_Nro= 4"

y si tiene "ñ"

"'ascii' codec can't decode byte 0xf1 in position 37: ordinal not in
range(128)"

Javier Castrillo
2008-08-07 11:25:35 UTC
Permalink
Post by Carlos Do Carmo
Ahora estoy teniendo problemas al modificar. :-)
Probaste ésto al conectar la db?:


# Conexión a la base de datos
self.db = MySQLdb.connect('localhost', 'usuario, 'passwd',
'nombre_db', charset='UTF8')


A mí me funcionó.

PD: Ni que me venga a visitar Pamela David a casa me pierdo la charla
de unicode...
--
Javier Castrillo

=========================================================
GNU / Linux User #242275

Jabber: riverplatense-***@public.gmane.org
Blog: http://javiercastrillo.wordpress.com
Site: http://carapa.com.ar
River: http://siguiendoariver.blogspot.com
=========================================================
Usá Software Libre
Facundo Batista
2008-08-06 21:17:08 UTC
Permalink
Post by Yaco
bienvenido a la pesadilla de los encodings!
with autobombo:
print "En las regionales doy una charla de "Entendiendo Unicode", ;)"

Slds...
--
. Facundo

Blog: http://www.taniquetil.com.ar/plog/
PyAr: http://www.python.org/ar/
Leonardo G. De Luca
2008-08-07 01:20:51 UTC
Permalink
Post by Facundo Batista
Post by Yaco
bienvenido a la pesadilla de los encodings!
print "En las regionales doy una charla de "Entendiendo Unicode", ;)"
Slds...
¡Es una charla muy clara e interesante para los que sufren con el
encoding! : -)
--
http://leorockway.wordpress.com
--
() ascii ribbon campaign - against html email
/\ www.asciiribbon.org - against proprietary attachments
Continue reading on narkive:
Loading...