[Python-de] utf8 Problem mit Blockgrenzen

Hans-Peter Jansen hpj at urpla.net
Sam Aug 20 14:55:53 CEST 2005


Hi Diez,

ich antworte mal an die Liste, so hat jeder was davon ;-)

Am Samstag, 20. August 2005 12:30 schrieb Diez B. Roggisch:
> > So, wie die Sache steht, bleibt mir wohl nix anderes übrig, als auf
> > zeilenweise Verarbeitung auszuweichen, oder hat jemand eine bessere
> > Idee?
>
> Ärgerliches Problem, ähnliches hatte ich auch schon mit DB-Spalten.
> Damals mit JAVA, dessen utf-encoder sowas dankenderweise überliest -
> die Daten waren dann zwar abgeschnitten, aber bei limitierten
> Spaltenbreiten passiert das eh.

Yup, und ich wette, diese Art von Problemen treten im asiatischen 
Sprachraum deutlich häufiger auf als bei uns..

> Kannst du nicht die Blöcke verketten? Dann könntest du im Fall eines
> Fehlers erstmal den nächsten anhängen. Es sollte doch schon _sehr_
> mit dem teufel zugehen, wenn du da nicht früher oder später einen
> grösseren Block bekommst, der sich umkodieren lässt.
>
> Etwa so:
>
> blocks = []
> while True:
>      data = self.a2psfile.read(BUFSIZE)
>      if not data:
>          break
>      blocks.append(data)
>      try:
>          out = "".join(blocks).decode('utf8').encode('cp850')
>          pfp.write(data)
>          blocks = []
>      except UnicodeDecodeError:
>          pass

Ahh, interessante Idee, aber ich versuche, den Speicherverbrauch 
möglichst deterministisch zu halten, sonst hätte ich mir den hassle mit 
dem Tempfile ganz sparen können, wenn im dümmsten Falle doch wieder 
alle Daten im Speicher landen. Alternativ könnte man die Blockgröße 
reduzieren, was dann zwar diese Wahrscheinlichkeit verringert, aber 
auch den Sinn und Zweck des blockweisen Verarbeitens in Frage stellt, 
also bleibt nach reiflicher Überlegung als beste Alternative doch nur 
die zeilenweise Verarbeitung (mit den Vorteilen der knappsten Notation 
und der Selbstdokumentiertheit ;-)).

Aber immerhin war dieser Fehler nützlich, einen Problemaspekt im Umgang 
mit Multibyte-Encodings aufzuzeigen, der mir bis dahin noch nicht so 
bewußt war (manchmal schlagen da wohl noch meine Assembler und C 
Wurzeln durch). 

Danke Dir vielmals,
Pete