Answers:
>>> print '"Hello,\\nworld!"'.decode('string_escape')
"Hello,
world!"
print(b"Hello,\nworld!".decode('unicode_escape'))
value.encode('utf-8').decode('unicode_escape')
value.encode('utf-8').decode('unicode_escape')
损坏字符串中的非ASCII字符。除非保证输入中仅包含ASCII字符,否则这不是有效的解决方案。
您可以使用ast.literal_eval
哪个是安全的:
安全地评估表达式节点或包含Python表达式的字符串。提供的字符串或节点只能由以下Python文字结构组成:字符串,数字,元组,列表,字典,布尔值和无。(结束)
像这样:
>>> import ast
>>> escaped_str = '"Hello,\\nworld!"'
>>> print ast.literal_eval(escaped_str)
Hello,
world!
ast
库需要引号(无论是"
或'
,甚至"""
或'''
)周围的escaped_str,因为它实际上是试图运行它Python代码,但提高了安全性(防止串注射)
str
是;该编解码器的答案是当它不是一个,但逃脱文本的一些其他形式(不引号作为字符串数据本身的一部分包围)。repr
str
bytes
unicode-escape
repr
[ERROR] TypeError: string indices must be integers
并且此解决方案可以解决该问题。取消转义字符串,然后解析为JSON。
所有给出的答案将在通用Unicode字符串上中断。据我所知,以下代码在所有情况下都适用于Python3:
from codecs import encode, decode
sample = u'mon€y\\nröcks'
result = decode(encode(sample, 'latin-1', 'backslashreplace'), 'unicode-escape')
print(result)
如注释中所述,您还可以像下面这样使用模块中的literal_eval
方法ast
:
import ast
sample = u'mon€y\\nröcks'
print(ast.literal_eval(F'"{sample}"'))
当您的字符串确实包含字符串文字(包括引号)时,也可以这样:
import ast
sample = u'"mon€y\\nröcks"'
print(ast.literal_eval(sample))
但是,如果不确定输入字符串是使用双引号还是单引号作为定界符,或者不确定根本不能正确转义输入字符串,则literal_eval
可能会花点时间SyntaxError
编码/解码方法仍然有效。
ast.literal_eval('"mon€y\\nröcks"') == "mon€y\nröcks"
使用Python 3.7.3对我来说工作正常
在python 3中,str
对象没有decode
方法,您必须使用bytes
对象。ChristopheD的答案涵盖了python 2。
# create a `bytes` object from a `str`
my_str = "Hello,\\nworld"
# (pick an encoding suitable for your str, e.g. 'latin1')
my_bytes = my_str.encode("utf-8")
# or directly
my_bytes = b"Hello,\\nworld"
print(my_bytes.decode("unicode_escape"))
# "Hello,
# world"
value.encode('utf-8').decode('unicode_escape')
。
encode
?