[Metakit] Python & Unicode

metakit at kaishaku.org metakit at kaishaku.org
Fri Mar 10 18:00:04 CET 2006


> > Thanks for the reply. Type S gives "not a python string", type B gives 
> > "wrong type for ByteProp". Here is the output:
> > 
> >  >>> db = metakit.storage("test.db", 2)
> >  >>> v = db.getas("test[name:B,test:S]")
> >  >>> v.append(name='abc',test='def')
> > 0
> >  >>> for row in v: print row.name, row.test
> > ...
> > abc def
> >  >>> v.append(name=u'abc',test='def')
> > Traceback (most recent call last):
> >   File "<stdin>", line 1, in ?
> > TypeError: wrong type for ByteProp
> >  >>> v.append(name='abc',test=u'def')
> > Traceback (most recent call last):
> >   File "<stdin>", line 1, in ?
> > TypeError: not a Python string
> 
> You are sending a Python unicode object.
> 
> You need to send an array of bytes.
> 
> ------------------------------------------------------------------------
> 
> import metakit
> 
> db = metakit.storage()
> people = db.getas('[name:S,namei:B]')
> 
> u16be = '\x00\x4a\x00\x6f\x00\xe5\x00\x6f'
> 
> people.append(name='Joao',namei=u16be)
> 
> print people[0].name
> print list(people[0].name)
> 
> print people[0].namei
> print list(people[0].namei)
> 
> print people[0].namei.decode('utf-16be')
> 
> ------------------------------------------------------------------------
> 
> C:\>unimeta
> Joao
> ['J', 'o', 'a', 'o']
>  J o s o
> ['\x00', 'J', '\x00', 'o', '\x00', '\xe5', '\x00', 'o']
> Joåo
> 
> ------------------------------------------------------------------------

If you're still lost, the additional u'abc' example I added may help.
ie. Your code will work if updated with u'def'.encode('utf-16be')

import metakit

db = metakit.storage()
people = db.getas('[name:S,namei:B]')

u16be = '\x00\x4a\x00\x6f\x00\xe5\x00\x6f'

people.append(name='Joao',namei=u16be)

print people[0].name
print list(people[0].name)

print people[0].namei
print list(people[0].namei)

print people[0].namei.decode('utf-16be')
print people[0].namei.decode('utf-16be').encode('cp437')
print people[0].namei.decode('utf-16be').encode('utf-16be')

print list(u16be)
print list(people[0].namei)

uabc  = u'abc'

people.append(name='abc',namei=uabc.encode('utf-16be'))
print people[1].namei
print people[1].namei.decode('utf-16be')

-- 
 kai



More information about the Metakit mailing list