【问题标题】:python 3, unicode conversion, two \u0000 as one characterpython 3,unicode转换,两个\u0000为一个字符
【发布时间】:2015-05-26 15:51:17
【问题描述】:

我的 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 (2bits) 而c++ 程序使用\u (4bits)。 但我不知道如何将b'\u00D1\u0082\u00D0\u00B5\u00D1\u0081\u00D1\u0082 test' 转换为'тест test'。 主要问题-python3将b'\u00D1\u0082\u00D0\u00B5\u00D1\u0081\u00D1\u0082'视为8个字符的字符串,但它只包含4个字符

【问题讨论】:

  • 显示您的 C++ 编码代码。看起来它将编码字节存储在 wchar_t 数组中,这是不正确的。
  • 我没有c++程序的源码

标签: string python-3.x unicode


【解决方案1】:

如果您从 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 编码是前 256 个 Unicode 代码点的 1:1 映射,因此使用此编解码器进行编码会将代码点转换回字节字符串中的字节值:

>>> s2 = s1.encode('latin1')
>>> s2
b'\xd1\x82\xd0\xb5\xd1\x81\xd1\x82 test'

现在可以将字节字符串解码为正确的 Unicode 字符串:

>>> s3 = s2.decode('utf8')
>>> s3
'тест test'

【讨论】:

  • 有效!我没有机会自己弄清楚这个解决方案。非常感谢))
猜你喜欢
  • 1970-01-01
  • 2019-11-10
  • 2015-10-27
  • 1970-01-01
  • 2018-11-19
  • 2016-02-01
  • 2018-04-29
  • 1970-01-01
  • 2014-01-27
相关资源
最近更新 更多