Saya tidak pernah yakin bahwa saya mengerti perbedaan antara str / unicode decode dan encode.
Saya tahu itu str().decode()
untuk ketika Anda memiliki string byte yang Anda tahu memiliki pengkodean karakter tertentu, mengingat nama pengkodean itu akan mengembalikan string unicode.
Saya tahu bahwa unicode().encode()
mengubah karakter unicode menjadi serangkaian byte sesuai dengan nama penyandian yang diberikan.
Tapi saya tidak mengerti apa str().encode()
dan unicode().decode()
untuk apa. Adakah yang bisa menjelaskan, dan mungkin juga mengoreksi hal lain yang saya salah di atas?
EDIT:
Beberapa jawaban memberikan info tentang apa yang .encode
dilakukan pada string, tetapi tidak ada yang tahu apa yang .decode
dilakukan untuk unicode.
Jawaban:
The
decode
Metode string unicode benar-benar tidak memiliki aplikasi sama sekali (kecuali jika Anda memiliki beberapa data non-teks dalam string unicode untuk beberapa alasan - lihat di bawah). Itu terutama ada karena alasan historis, saya pikir. Dalam Python 3 itu benar-benar hilang.unicode().decode()
akan melakukan implisit encoding daris
menggunakan default (ascii) codec. Verifikasi seperti ini:Pesan kesalahannya persis sama.
Untuk
str().encode()
itu sebaliknya - ia mencoba implisit decoding daris
dengan encoding default:Digunakan seperti ini,
str().encode()
juga berlebihan.Tetapi ada aplikasi lain dari metode terakhir yang berguna: ada penyandian yang tidak ada hubungannya dengan set karakter, dan dengan demikian dapat diterapkan ke string 8-bit dengan cara yang bermakna:
Anda benar, meskipun: penggunaan "encoding" yang ambigu untuk kedua aplikasi ini adalah ... awkard. Sekali lagi, dengan terpisah
byte
danstring
mengetikkan Python 3, ini tidak lagi menjadi masalah.sumber
.decode()
pada string Unicode mungkin berguna misalnya,print u'\\u0203'.decode('unicode-escape')
print u'\\u0203'.encode('utf8').decode('unicode-escape')
codecs.decode(u'\\u0203', 'unicode-escape')
ascii
pengkodean:\\u0203\u00e4'.encode('ascii').decode('unicode-escape')
.encode('ascii').decode('unicode-escape')
) tidak bergantung padasys.getdefaultencoding()
.Untuk mewakili string unicode sebagai string byte dikenal sebagai pengodean . Gunakan
u'...'.encode(encoding)
.Contoh:
Anda biasanya menyandikan string unicode kapan pun Anda perlu menggunakannya untuk IO, misalnya mentransfernya melalui jaringan, atau menyimpannya ke file disk.
Untuk mengkonversi string byte ke string unicode dikenal sebagai decoding . Gunakan
unicode('...', encoding)
atau '...'. Decode (pengodean).Contoh:
Anda biasanya mendekode string byte setiap kali Anda menerima data string dari jaringan atau dari file disk.
Saya percaya ada beberapa perubahan dalam penanganan unicode di python 3, jadi di atas mungkin tidak benar untuk python 3.
Beberapa tautan bagus:
sumber
anUnicode. encode ('encoding') menghasilkan objek string dan dapat dipanggil pada objek unicode
Sebuah benang. decode ('encoding') menghasilkan objek unicode dan dapat dipanggil pada string, dikodekan dalam pengkodean yang diberikan.
Beberapa penjelasan lagi:
Anda dapat membuat beberapa objek unicode, yang tidak memiliki set penyandian. Cara itu disimpan oleh Python dalam memori bukan urusan Anda. Anda dapat mencarinya, membaginya dan memanggil fungsi memanipulasi string yang Anda suka.
Tetapi ada saatnya, ketika Anda ingin mencetak objek unicode Anda ke konsol atau ke beberapa file teks. Jadi, Anda harus menyandikannya (misalnya - dalam UTF-8), Anda memanggil penyandian ('utf-8') dan Anda mendapatkan string dengan bagian dalam '\ u <someNumber>', yang dapat dicetak dengan sempurna.
Kemudian, sekali lagi - Anda ingin melakukan yang sebaliknya - membaca string yang disandikan dalam UTF-8 dan memperlakukannya sebagai Unicode, sehingga \ u360 akan menjadi satu karakter, bukan 5. Kemudian Anda mendekodekan string (dengan pengkodean yang dipilih) dan dapatkan objek baru dari jenis unicode.
Sama seperti catatan tambahan - Anda dapat memilih beberapa pengkodean cabul, seperti 'zip', 'base64', 'busuk' dan beberapa dari mereka akan dikonversi dari string ke string, tetapi saya percaya kasus yang paling umum adalah yang melibatkan UTF-8 / UTF-16 dan string.
sumber
mybytestring.encode (somecodec) bermakna untuk nilai-nilai ini
somecodec
:Saya tidak yakin apa yang baik untuk decoding teks unicode diterjemahkan. Mencoba itu dengan penyandian apa pun tampaknya selalu mencoba untuk menyandikan dengan penyandian default sistem terlebih dahulu.
sumber
Ada beberapa pengkodean yang dapat digunakan untuk mende / encode dari str ke str atau dari unicode ke unicode. Misalnya base64, hex atau bahkan rot13. Mereka terdaftar dalam modul codec .
Edit:
Pesan dekode pada string unicode dapat membatalkan operasi penyandian yang sesuai:
Jenis yang dikembalikan adalah str bukan unicode yang sangat disayangkan menurut saya. Tetapi ketika Anda tidak melakukan en- / decode yang tepat antara str dan unicode ini sepertinya berantakan.
sumber
Jawaban sederhana adalah bahwa mereka adalah kebalikan dari satu sama lain.
Komputer menggunakan unit byte yang sangat mendasar untuk menyimpan dan memproses informasi; itu tidak ada artinya bagi mata manusia.
Misalnya, '\ xe4 \ xb8 \ xad \ xe6 \ x96 \ x87' adalah representasi dari dua karakter bahasa Mandarin, tetapi komputer hanya tahu (artinya mencetak atau menyimpan) itu adalah Karakter Cina ketika mereka diberikan kamus untuk mencari yang Kata Cina, dalam hal ini, ini adalah kamus "utf-8", dan akan gagal menunjukkan kata Cina yang dimaksud dengan benar jika Anda melihat kamus yang berbeda atau salah (menggunakan metode pengodean kata yang berbeda).
Dalam kasus di atas, proses komputer untuk mencari kata dalam bahasa Cina adalah
decode()
.Dan proses penulisan komputer orang Cina ke dalam memori komputer adalah
encode()
.Jadi informasi yang disandikan adalah byte mentah, dan informasi yang di-decode adalah byte mentah dan nama kamus untuk referensi (tetapi bukan kamus itu sendiri).
sumber