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

时间:2018-04-10 14:21:21

标签: python-3.x unicode utf-8 python-unicode

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

让我们有这样的字符串:

a = "Je-li pro za\\xc5\\x99azov\\xc3\\xa1n\\xc3\\xad"

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

使用a.decode("utf-8")我得到 AttributeError:'str'对象没有属性'decode',因为Python意味着对象已经被解码。

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

如何从a获取unicode字符串 Je-liprozařazování

1 个答案:

答案 0 :(得分:4)

您必须编码/解码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')
)

Try it online!

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

不安全但更短的方式:

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

Try it online!

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