Cara membuat string unicode dengan python3

99

Saya menggunakan ini:

u = unicode(text, 'utf-8')

Tetapi mendapatkan kesalahan dengan Python 3 (atau ... mungkin saya lupa memasukkan sesuatu):

NameError: global name 'unicode' is not defined

Terima kasih.

cnd
sumber
17
Jika ada alasan bagus untuk meningkatkan ke python 3, itu adalah unicode secara default.
JBernardo

Jawaban:

137

String literal adalah unicode secara default di Python3.

Dengan asumsi itu textadalah sebuah bytesobjek, gunakan sajatext.decode('utf-8')

unicodePython2 setara dengan strdi Python3, jadi Anda juga bisa menulis:

str(text, 'utf-8')

jika kamu memilih.

John La Rooy
sumber
58
TypeError: decoding str tidak didukung
Gank
9
@Gank, Dalam Python3 a stradalah unicode, yaitu. itu "diterjemahkan" sehingga tidak masuk akal untuk memanggil decodedi atasnya
John La Rooy
TypeError yang sama. Silakan ganti dengan str (txt), atau kode dari @magicrebirth di bawah
Simon
3
Sampel asli tidak jelas. Jadi di python3, jika ingin melakukannya str(text, 'utf-8'), teks harus berupa string biner. misalnyastr(b'this is a binary', 'utf-8')
killua8p
10

Apa yang baru di Python 3.0 mengatakan:

Semua teks adalah Unicode; namun Unicode yang dikodekan direpresentasikan sebagai data biner

Jika Anda ingin memastikan Anda mengeluarkan utf-8, berikut adalah contoh dari halaman ini di unicode di 3.0 :

b'\x80abc'.decode("utf-8", "strict")
Gemetar
sumber
1
inilah yang kami butuhkan untuk '\ x80abc'.decode ("utf-8", "strict") di Python 2, terima kasih
workplaylifecycle
9

Sebagai solusinya, saya telah menggunakan ini:

# Fix Python 2.x.
try:
    UNICODE_EXISTS = bool(type(unicode))
except NameError:
    unicode = lambda s: str(s)
kelahiran kembali ajaib
sumber
12
Mengapa Anda menggunakan fungsi lambda? Metode ini disebut dengan cara yang sama dalam kasus apa pun. Ini adalah variasi sederhana: try: unicode = str; except: pass.
Nicolas Bouliane
1
Sepertinya Anda bisa melakukannya unicode = strkarena tidak akan gagal dalam 2 atau 3
Nickolai
Atau from six import u as unicodeyang saya lebih suka hanya karena ini lebih mendokumentasikan diri (karena enam adalah lapisan kompatibilitas 2/3) daripadaunicode = str
Nickolai
3

Ini bagaimana saya memecahkan masalah saya untuk mengonversi karakter seperti \ uFE0F, \ u000A, dll. Dan juga emoji yang dikodekan dengan 16 byte.

example = 'raw vegan chocolate cocoa pie w chocolate & vanilla cream\\uD83D\\uDE0D\\uD83D\\uDE0D\\u2764\\uFE0F Present Moment Caf\\u00E8 in St.Augustine\\u2764\\uFE0F\\u2764\\uFE0F '
import codecs
new_str = codecs.unicode_escape_decode(example)[0]
print(new_str)
>>> 'raw vegan chocolate cocoa pie w chocolate & vanilla cream\ud83d\ude0d\ud83d\ude0d❤️ Present Moment Cafè in St.Augustine❤️❤️ '
new_new_str = new_str.encode('utf-16', 'surrogatepass').decode('utf-16')
print(new_new_str)
>>> 'raw vegan chocolate cocoa pie w chocolate & vanilla cream😍😍❤️ Present Moment Cafè in St.Augustine❤️❤️ '
Ilyas
sumber
0

Dalam program Python 2 yang saya gunakan selama bertahun-tahun ada baris ini:

ocd[i].namn=unicode(a[:b], 'utf-8')

Ini tidak berhasil dengan Python 3.

Namun, program tersebut ternyata berhasil dengan:

ocd[i].namn=a[:b]

Saya tidak ingat mengapa saya meletakkan unicode di tempat pertama, tetapi saya pikir itu karena namanya dapat berisi huruf Swedia åäöÅÄÖ. Tetapi bahkan mereka bekerja tanpa "unicode".

Per Persson
sumber
0

cara termudah di python 3.x

text = "hi , I'm text"
text.encode('utf-8')
mosi_kha
sumber