[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