[python] XMLRPC a unicode

Bystroushaak Bystrousak na seznam.cz
Pátek Červen 12 13:16:44 CEST 2009


Ja bych to tak resil taky.

> ------------ Původní zpráva ------------
> Od: slush <slush na slush.cz>
> Předmět: Re: [python] XMLRPC a unicode
> Datum: 12.6.2009 02:46:11
> ----------------------------------------
> Pokud by to nekoho zajimalo, problem jsem (docasne nafurt) vyresil
> timto zpusobem:
> 
> #!/usr/bin/python
> from SimpleXMLRPCServer import SimpleXMLRPCServer
> from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler
> import serial
> import base64
> 
> device = '/dev/arduino'
> baud = 57600
> timeout = 1
> 
> server_listen = 'localhost'
> server_port = 8000
> 
> class NetSerial(serial.Serial):
>     # Original function returns bool sometimes...
>     def inWaiting_int(self):
>         return int(self.inWaiting())
> 
>     # Beware UTF-8 :-)
>     def write_base64(self, s):
>         self.write(base64.b64decode(s))
> 
> class RequestHandler(SimpleXMLRPCRequestHandler):
>     rpc_paths = ('/RPC2',)
> 
> server = SimpleXMLRPCServer((server_listen, server_port),
>                             requestHandler=RequestHandler,
>                             allow_none=True, encoding='ascii')
> 
> server.register_introspection_functions()
> server.register_instance(NetSerial(device, baud, timeout=timeout))
> server.serve_forever()
> 
> pyserial jsem tedy rozsiril o funkci write_base64, ktera uz tedy
> nemusi resit UTF-8 ;-). Predpokladam, ze stejny hack bude fungovat i
> na read, az to budu potrebovat. Reseni bohuzel neni transparentni a
> trida nema s pyserial kompatibilni rozhrani, ale co se da delat. Kdyby
> nekdo vedel, jak presvedcit XMLRPC s UTF, rad to upravim.
> 
> Ostatne v reseni bylo zapotrebi udelat jeste hack s inWaiting(). Moc
> jsem to nestudoval, ale zda se, ze takhle to funguje...
> 
> Marek
> 
> 2009/6/12 slush <slush na slush.cz>:
> > Zdravim,
> >
> > potrebuji pristupovat k seriovemu portu pocitace A z pocittace B na
> > lokalni siti. Napadlo me pouzit XML-RPC jako transparentni mezivrstvu
> > k pyserial tak, ze se klientska aplikace (puvodne bezici na A, nyni
> > nove na B) temer nemusi upravovat - pouze misto lokalni instance
> > pyserial vytvorim klienta XMLRPC.
> >
> > Zda se, ze by to i mohlo fungovat, bohuzel na port potrebuji posilat
> > binarni data. A zde jsem narazil na problem s kodovanim znaku u
> > knihovny xmlrpclib. Pri snaze zapsat binarni data mi to vrati tento
> > traceback:
> >
> >  File "/usr/lib/python2.6/encodings/utf_8.py", line 16, in decode
> >    return codecs.utf_8_decode(input, errors, True)
> > UnicodeDecodeError: 'utf8' codec can't decode byte 0xff in position 0:
> > unexpected code byte
> >
> > Data skladam nasledujicim zpusobem:
> >  data = chr(255)+'a'+chr(e.axis)+chr(mapped)
> > kde e.axis i mapped jsou 1B cisla. Jedna se tedy o obycejne ASCII.
> >
> > S tim si bohuzel nevim rady, UTF jsem se v pythonu vzdy vyhybal, jako
> > cert krizi. Nedokaze nekdo poradit, prosim?
> >
> >
> > S pozdravem
> > Marek
> >
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python
> 
> 
> 


Další informace o konferenci Python