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?
正确的解决方案是读取直到到达终止字节,然后在那时转换为 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)