我的python3脚本通过管道从c ++程序接收字符串。通过Unicode代码点编码的字符串。我需要正确解码。
例如,考虑包含西里尔符号的字符串: 'тест test'
尝试使用python3:对该字符串进行编码print('тест test'.encode())
。我们有b'\xd1\x82\xd0\xb5\xd1\x81\xd1\x82 test'
C ++程序将此字符串编码为: b'\u00D1\u0082\u00D0\u00B5\u00D1\u0081\u00D1\u0082 test'
编码的字符串看起来非常相似-python3使用\x
(2位)和c ++程序使用\u
(4位)。但我不知道如何转换b'\u00D1\u0082\u00D0\u00B5\u00D1\u0081\u00D1\u0082 test'
为'тест test'
。主要问题-python3被认为b'\u00D1\u0082\u00D0\u00B5\u00D1\u0081\u00D1\u0082'
是8个字符的字符串,但它仅包含4个字符
如果您从C ++收到的字符串在Python中是以下内容:
s = b'\u00D1\u0082\u00D0\u00B5\u00D1\u0081\u00D1\u0082 test'
然后,它将对其进行解码:
result = s.decode('unicode-escape').encode('latin1').decode('utf8')
print(result)
输出:
тест test
第一阶段将接收到的字节字符串转换为Unicode字符串:
>>> s1 = s.decode('unicode-escape')
>>> s1
'Ñ\x82еÑ\x81Ñ\x82 test'
不幸的是,Unicode代码点实际上是UTF-8字节值。的latin1
编码是1:第一256个Unicode码点1映射,与该编解码器转换的编码点返回至字节值中的字节字符串,以便编码:
>>> s2 = s1.encode('latin1')
>>> s2
b'\xd1\x82\xd0\xb5\xd1\x81\xd1\x82 test'
现在,可以将字节字符串解码为正确的Unicode字符串:
>>> s3 = s2.decode('utf8')
>>> s3
'тест test'
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句