Decode a utf-8 string encoded as described in MQTT Version
        3.1.1 section 1.5.3 line 177.  This is a 16-bit unsigned length
        followed by a utf-8 encoded string.

        Raises
        ------
        UnderflowDecodeError
            Raised when a read failed to extract enough bytes from the
            underlying stream to decode the string.
        DecodeError
            When any code point in the utf-8 string is invalid.

        Returns
        -------
        int
            Number of bytes consumed.
        str
            A string utf-8 decoded from the underlying stream.

def unpack_utf8(self):
        """Decode a utf-8 string encoded as described in MQTT Version
        3.1.1 section 1.5.3 line 177.  This is a 16-bit unsigned length
        followed by a utf-8 encoded string.

        Raises
        ------
        UnderflowDecodeError
            Raised when a read failed to extract enough bytes from the
            underlying stream to decode the string.
        DecodeError
            When any code point in the utf-8 string is invalid.

        Returns
        -------
        int
            Number of bytes consumed.
        str
            A string utf-8 decoded from the underlying stream.
        """
        num_bytes_consumed, s = decode_utf8(self.__f)
        self.__num_bytes_consumed += num_bytes_consumed
        return num_bytes_consumed, s