Python 3.6,utf-8 到 unicode 的转换,带双反斜杠的字符串

Mar*_* L. 2 unicode utf-8 python-3.x python-unicode

有很多关于 utf-8 > unicode 转换的问题,但我仍然没有找到我的问题的答案。

让我们有这样的字符串:

a = "Je-li pro za\\xc5\\x99azov\\xc3\\xa1n\\xc3\\xad"
Run Code Online (Sandbox Code Playgroud)

Python 3.6 理解这个字符串就像Je-li pro za\xc5\x99azov\xc3\xa1n\xc3\xad。我需要将此类似 utf-8 的字符串转换为 unicode 表示形式。最终的结果应该是Je-li pro za?azování

随着a.decode("utf-8")我得到AttributeError: 'str' object has no attribute 'decode',因为 Python 意味着该对象已经被解码。

如果我先用 将它转换为字节bytes(a, "utf-8"),反斜杠只会加倍并再次.decode("utf-8")将其返回到我当前的状态a

如何获得unicode字符串济利亲咱?azování从这个a

use*_*729 5

您必须编码/解码 4 次才能获得所需的结果:

print(
  "Je-li pro za\\xc5\\x99azov\\xc3\\xa1n\\xc3\\xad"

  # actually any encoding support printable ASCII would work, for example utf-8
  .encode('ascii')

  # unescape the string
  # source: https://stackoverflow.com/a/1885197
  .decode('unicode-escape')

  # latin-1 also works, see https://stackoverflow.com/q/7048745
  .encode('iso-8859-1')

  # finally
  .decode('utf-8')
)
Run Code Online (Sandbox Code Playgroud)

在线试试吧!

此外,如果可以,请考虑告诉您的目标程序(数据源)提供不同的输出格式(例如字节数组或 base64 编码)。

不安全但更短的方法:

st = "Je-li pro za\\xc5\\x99azov\\xc3\\xa1n\\xc3\\xad"
print(eval("b'"+st+"'").decode('utf-8'))
Run Code Online (Sandbox Code Playgroud)

在线试试吧!

ast.literal_eval,但在这里可能不值得使用。