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

Wil*_*ill 5 python unicode encoding utf-8 python-2.7

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

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

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

x = read_next_byte()
if x == 0:
    break
my_string += chr(x)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

Sha*_*ger 4

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

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

以上是对你的原代码最直接的翻译。有趣的是,这是一种可以使用两个 argiter来显着简化代码的情况,方法是将 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')
Run Code Online (Sandbox Code Playgroud)