我有一个返回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?
答案 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')