Misalkan saya memiliki string yang merupakan versi backslash-escape dari string lain. Adakah cara mudah, dengan Python, untuk melepaskan string? Saya bisa, misalnya, melakukan:
>>> escaped_str = '"Hello,\\nworld!"'
>>> raw_str = eval(escaped_str)
>>> print raw_str
Hello,
world!
>>>
Namun itu melibatkan penerusan string (mungkin tidak tepercaya) ke eval () yang merupakan risiko keamanan. Apakah ada fungsi dalam lib standar yang mengambil string dan menghasilkan string tanpa implikasi keamanan?
print(b"Hello,\nworld!".decode('unicode_escape'))
value.encode('utf-8').decode('unicode_escape')
value.encode('utf-8').decode('unicode_escape')
merusak karakter non-ASCII dalam string . Kecuali jika masukan dijamin hanya berisi karakter ASCII, ini bukan solusi yang valid.Anda dapat menggunakan
ast.literal_eval
yang aman:Seperti ini:
sumber
ast
pustaka memerlukan tanda kutip (baik"
atau'
, genap"""
atau'''
) di sekitar escaped_str Anda, karena ia sebenarnya mencoba menjalankannya sebagai kode Python tetapi meningkatkan keamanan (mencegah injeksi string)str
adalah arepr
dari astr
ataubytes
objek seperti dalam kasus OP; yangunicode-escape
jawabannya codec adalah ketika itu bukanrepr
, tapi beberapa bentuk lain dari teks lolos (tidak dikelilingi oleh tanda kutip sebagai bagian dari data string itu sendiri).[ERROR] TypeError: string indices must be integers
ini dan solusi ini berhasil menyelesaikannya. Hapus stringnya, lalu parsing sebagai JSON.Semua jawaban yang diberikan akan rusak pada string Unicode umum. Berikut ini berfungsi untuk Python3 dalam semua kasus, sejauh yang saya tahu:
Seperti yang diuraikan dalam komentar, Anda juga dapat menggunakan
literal_eval
metode dariast
modul seperti:Atau seperti ini ketika string Anda benar - benar berisi string literal (termasuk tanda kutip):
Namun, jika Anda tidak yakin apakah string input menggunakan tanda kutip ganda atau tunggal sebagai pembatas, atau jika Anda tidak dapat mengasumsikannya untuk di-escape sama sekali,
literal_eval
mungkin perlu waktuSyntaxError
lama metode encode / decode akan tetap berfungsi.sumber
ast.literal_eval('"mon€y\\nröcks"') == "mon€y\nröcks"
berfungsi dengan baik untuk saya dengan Python 3.7.3Di python 3,
str
objek tidak memilikidecode
metode dan Anda harus menggunakanbytes
objek. Jawaban ChristopheD mencakup python 2.sumber
value.encode('utf-8').decode('unicode_escape')
,.encode
?