def read(self, frame, data): enc, term = self._encodings[frame.encoding] try: # allow missing termination return decode_terminated(data, enc, strict=False) except ValueError: # utf-16 termination with missing BOM, or single NULL if not data[:len(term)].strip(b"\x00"): return u"", data[len(term):] # utf-16 data with single NULL, see issue 169 try: return decode_terminated(data + b"\x00", enc) except ValueError: raise ID3JunkFrameError
def test_lax(self): # missing termination self.assertEqual( decode_terminated(b"abc", "utf-8", strict=False), (u"abc", b"")) # missing termination and truncated data truncated = u"\xe4\xe4".encode("utf-8")[:-1] self.assertRaises( UnicodeDecodeError, decode_terminated, truncated, "utf-8", strict=False)
def test_all(self): values = [u"", u"", u"\xe4", u"abc", u"", u""] for codec in ["utf8", "utf-8", "utf-16", "latin-1", "utf-16be"]: # NULL without the BOM term = u"\x00".encode(codec)[-2:] data = b"".join(v.encode(codec) + term for v in values) for v in values: dec, data = decode_terminated(data, codec) self.assertEqual(dec, v) self.assertEqual(data, b"")
def read(self, frame, data): texts = [] encoding, term = self._encodings[frame.encoding] while data: try: value, data = decode_terminated(data, encoding) except ValueError: raise ID3JunkFrameError if len(data) < 4: raise ID3JunkFrameError time, = struct.unpack(">I", data[:4]) texts.append((value, time)) data = data[4:] return texts, b''
def read(self, frame, data): texts = [] encoding, term = self._encodings[frame.encoding] while data: try: value, data = decode_terminated(data, encoding) except ValueError: raise ID3JunkFrameError if len(data) < 4: raise ID3JunkFrameError time, = struct.unpack(">I", data[:4]) texts.append((value, time)) data = data[4:] return texts, ""