[Python-de] utf8 Problem mit Blockgrenzen

Hans-Peter Jansen hpj at urpla.net
Sam Aug 20 01:02:05 CEST 2005


Hi *,

ich hänge hier an einem etwas lästigen Problem in einem Druckfilter, der 
intern mit unicode arbeitet, und an den IO Grenzen passend 
de/encodiert..

Als Option gibt's die Möglichkeit, das Ganze durch a2ps zu schleusen, 
wobei die Ausgabe dann in einer temp. Datei utf8 kodiert geparkt wird. 

Weil die Druckdaten auch noch Liniengrafik enthalten, muß ich bei der 
Ausgabe von utf8 nach cp850 wandeln, damit a2ps etwas damit anfangen 
kann. Aus Effizienzgründen verarbeite ich ganze Blöcke (BLOCKSIZE = 
8192):

            pcmd = \
'a2ps -q -%sB -l%s --borders=no --encoding=ibm-cp437 -o-' % (
		self.a2ps, cpl)
            pfp = os.popen(pcmd, 'w')
            if pfp:
                while True:
                    data = self.a2psfile.read(BUFSIZE)
                    if not data:
                        break
                    data = data.decode('utf8').encode('cp850')
                    pfp.write(data)
            else:
                err("failed to open a2ps pipe")

Das funkt ja auch ganz gut, außer wenn jetzt dummerweise genau auf der 
Blockgrenze ein multibyte Zeichen liegt, geht das Ganze in die Hose:

internal error: Traceback (most recent call last):
  File "/usr/bin/lpf", line 1421, in ?
    ret = lpf.run()
  File "/usr/bin/lpf", line 1309, in run
    self.lpr.close()
  File "/usr/bin/lpf", line 1007, in close
    data = data.decode('utf8').encode('cp850')
  File "/usr/lib/python2.4/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe2 in position 
8191: unexpected end of data

So, wie die Sache steht, bleibt mir wohl nix anderes übrig, als auf 
zeilenweise Verarbeitung auszuweichen, oder hat jemand eine bessere 
Idee?

Pete