iconv codecs corrupt stateful encodings when decoding incrementally
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 77.2k
- Forks
- 35.9k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
Bug description:
The iconv-backed codecs start a fresh conversion on every call, so an incremental decode of a stateful encoding loses the shift state and silently returns wrong text. iso-2022-cn has no built-in codec, so the plain name reaches the iconv codec:
import codecs
blob = 'ABC中文DEF'.encode('iso-2022-cn')
print('one-shot: ', blob.decode('iso-2022-cn'))
d = codecs.getincrementaldecoder('iso-2022-cn')()
print('incremental:', ''.join(d.decode(bytes([b])) for b in blob) + d.decode(b'', True))
one-shot: ABC中文DEF
incremental: ABCVPNDDEF
codecs.iterdecode() and StreamReader.read(1) are wrong in the same way. A stateful encoding forced with the iconv: prefix is also affected, even when it has a built-in codec.
Either the codec objects need to keep one conversion across calls, or the iconv search function should refuse stateful encodings, which would make iso-2022-cn a LookupError.
The iconv codecs are new in 3.16 (gh-152997), so no released version is affected.
CPython versions tested on:
CPython main branch
Operating systems tested on:
Linux
Linked PRs
- gh-154862
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Reproduziere das Beispiel zur inkrementellen Dekodierung für den iconv-backed codec und untersuche anschließend die im Bericht beschriebenen Pfade für den inkrementellen Decoder, codecs.iterdecode() und StreamReader.read(1). Erledigt ist die Aufgabe, wenn zustandsbehaftete Encodings ihren Konvertierungszustand über mehrere Aufrufe hinweg bewahren oder die Suchfunktion nicht unterstützte zustandsbehaftete Encodings konsistent ablehnt und die gezeigten Fälle durch Tests abgedeckt sind.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- backend
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 35/100