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

时间:2016-09-26 19:57:25

标签: python python-2.7 unicode encoding utf-8

我有一个返回UTF-8编码字符串的设备。我只能逐字节地读取它,读取由一个值为0x00的字节终止。

我正在为其他人创建一个Python 2.7函数来访问我的设备并返回字符串。

在之前的设计中,当设备刚刚返回ASCII时,我在循环中使用了它:

x = read_next_byte()
if x == 0:
    break
my_string += chr(x)

其中x是从设备读取的最新字节值。

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

当x> 127时,

chr(x)可以理解地导致错误,所以我认为使用unichr(x)可能有效,但是假设传递的值是完整的unicode字符值,但我只有一部分0-255。

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

同样,如果我在Python中获得了UTF-8字符串,我如何将其分解为单个字节以发送到我的设备并仍然保持UTF-8?

1 个答案:

答案 0 :(得分:3)

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

mybytes = bytearray()
while True:
    x = read_next_byte()
    if x == 0:
        break
    mybytes.append(x)
my_string = mybytes.decode('utf-8')

以上是您原始代码的最直接翻译。有趣的是,这是two arg iter可以通过将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')