Python—逐字节读取UTF-8编码的字符串

Python—逐字节读取UTF-8编码的字符串,python,python-2.7,unicode,encoding,utf-8,Python,Python 2.7,Unicode,Encoding,Utf 8,我有一个返回UTF-8编码字符串的设备。我只能一个字节一个字节地从中读取,并且读取被值为0x00的字节终止 我正在制作一个Python2.7函数,让其他人访问我的设备并返回字符串 在以前的设计中,当设备刚刚返回ASCII时,我在循环中使用了此选项: x = read_next_byte() if x == 0: break my_string += chr(x) 其中x是从设备读取的最新字节值 现在设备可以返回UTF-8编码的字符串,但我不确定如何将返回的字节转换为UTF-8编码的字符

我有一个返回UTF-8编码字符串的设备。我只能一个字节一个字节地从中读取,并且读取被值为0x00的字节终止

我正在制作一个Python2.7函数,让其他人访问我的设备并返回字符串

在以前的设计中,当设备刚刚返回ASCII时,我在循环中使用了此选项:

x = read_next_byte()
if x == 0:
    break
my_string += chr(x)
其中x是从设备读取的最新字节值

现在设备可以返回UTF-8编码的字符串,但我不确定如何将返回的字节转换为UTF-8编码的字符串/unicode

chr(x)
可以理解,当x>127时会导致错误,因此我认为使用
unichr(x)
可能会起作用,但这假设传递的值是完整的unicode字符值,但我只有0-255部分

那么,我如何将从设备返回的字节转换成可以在Python中使用的字符串,并且仍然可以处理完整的UTF-8字符串呢


类似地,如果在Python中给我一个UTF-8字符串,我如何将其分解为单个字节发送到我的设备并仍然保持UTF-8?

正确的解决方案是读取直到到达终止字节,然后在此时转换为UTF-8(因此您拥有所有字符):

以上是对原始代码最直接的翻译。有趣的是,在这种情况下,可以通过将C风格的有状态字节读取器函数转换为Python迭代器来显著简化代码,让您只需一行代码:

# If this were Python 3 code, you'd use the bytes constructor instead of bytearray
my_string = bytearray(iter(read_next_byte, 0)).decode('utf-8')

好极了这似乎很有效。因此,要做相反的事情并对字节数组进行编码,我可以使用这个对吗
my_bytes=bytearray(my_string,'utf-8')
然后循环
my_bytes
发送单个字节。@Will:是的。在Py3中,执行
my_string.encode('utf-8')
(这将获得
字节
,其行为类似于Py3中的不可变
字节
);但是在Py2中,
encode
获取
str
,它通过其字符的
len
1
str
进行迭代,而不是从0-255开始通过
int
s进行迭代。无论哪种方式,您都可以迭代结果并调用写入函数:
在bytearray(我的字符串'utf-8')中为b写入一个字节(b)
# If this were Python 3 code, you'd use the bytes constructor instead of bytearray
my_string = bytearray(iter(read_next_byte, 0)).decode('utf-8')