Saya bekerja dengan perpustakaan yang mengembalikan string byte dan saya perlu mengubahnya menjadi string.
Meskipun saya tidak yakin apa bedanya - jika ada.
Dengan asumsi Python 3 (dalam Python 2, perbedaan ini sedikit kurang jelas) - string adalah urutan karakter, yaitu unicode codepoints ; ini adalah konsep abstrak, dan tidak dapat langsung disimpan di disk. String byte adalah urutan, tidak mengherankan, byte - hal-hal yang dapat disimpan pada disk. Pemetaan di antara mereka adalah pengkodean - ada cukup banyak (dan sangat banyak kemungkinan) - dan Anda perlu tahu mana yang berlaku dalam kasus tertentu untuk melakukan konversi, karena pengkodean yang berbeda dapat memetakan byte yang sama ke string yang berbeda:
>>> b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'.decode('utf-16')
'蓏콯캁澽苏'
>>> b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'.decode('utf-8')
'τoρνoς'
Setelah Anda tahu mana yang harus digunakan, Anda dapat menggunakan .decode()
metode byte string untuk mendapatkan string karakter yang tepat seperti di atas. Untuk kelengkapan, .encode()
metode string karakter sebaliknya:
>>> 'τoρνoς'.encode('utf-8')
b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'
str
tipenya sama denganbytes
tipenya; jawaban ini secara setara membandingkanunicode
tipe (tidak ada dalam Python 3) denganstr
tipe.str
tidak dapat diakses atau relevan dari sisi Python; struktur data hanyalah urutan codepoint. Di bawah PEP 393 , pengkodean internal yang tepat adalah salah satu dari Latin-1, UCS2 atau UCS4, dan representasi utf-8 dapat di-cache setelah diminta pertama kali, tetapi bahkan kode C tidak disarankan untuk mengandalkan detail internal ini.Satu-satunya hal yang dapat disimpan oleh komputer adalah byte.
Untuk menyimpan sesuatu di komputer, Anda harus terlebih dahulu menyandikannya , yaitu mengonversinya menjadi byte. Sebagai contoh:
MP3
,WAV
, dllPNG
,JPEG
, dllASCII
,UTF-8
, dllMP3
,WAV
,PNG
,JPEG
,ASCII
DanUTF-8
adalah contoh pengkodean . Pengkodean adalah format untuk mewakili audio, gambar, teks, dll dalam byte.Dalam Python, string byte hanya itu: urutan byte. Itu tidak bisa dibaca manusia. Di bawah tenda, semuanya harus dikonversi ke string byte sebelum dapat disimpan di komputer.
Di sisi lain, string karakter, sering hanya disebut "string", adalah urutan karakter. Itu bisa dibaca manusia. Sebuah string karakter tidak dapat langsung disimpan di komputer, itu harus dikodekan terlebih dahulu (diubah menjadi string byte) Ada beberapa pengkodean di mana string karakter dapat dikonversi menjadi string byte, seperti
ASCII
danUTF-8
.Kode Python di atas akan mengkodekan string
'I am a string'
menggunakan pengkodeanASCII
. Hasil dari kode di atas akan berupa string byte. Jika Anda mencetaknya, Python akan menyatakannya sebagaib'I am a string'
. Ingat, bagaimanapun, string byte itu tidak dapat dibaca oleh manusia , hanya saja Python menerjemahkannya dariASCII
saat Anda mencetaknya. Dalam Python, string byte diwakili olehb
, diikuti oleh string byteASCII
representasi .String byte dapat didekodekan kembali menjadi string karakter, jika Anda tahu pengkodean yang digunakan untuk menyandikannya.
Kode di atas akan mengembalikan string asli
'I am a string'
.Pengkodean dan dekode adalah operasi terbalik. Semuanya harus dikodekan sebelum dapat ditulis ke disk, dan itu harus di-decode sebelum dapat dibaca oleh manusia.
sumber
Catatan: Saya akan menguraikan lebih banyak jawaban saya untuk Python 3 karena akhir kehidupan Python 2 sangat dekat.
Dalam Python 3
bytes
terdiri dari urutan nilai 8-bit yang tidak ditandatangani, sementarastr
terdiri dari urutan titik kode Unicode yang mewakili karakter tekstual dari bahasa manusia.Meskipun
bytes
danstr
tampaknya bekerja dengan cara yang sama, instance mereka tidak kompatibel satu sama lain, yaitu,bytes
danstr
instance tidak dapat digunakan bersama dengan operator seperti>
dan+
. Selain itu, perlu diingat bahwa perbandinganbytes
danstr
contoh untuk kesetaraan, yaitu menggunakan==
, akan selalu dievaluasiFalse
bahkan ketika mereka mengandung karakter yang persis sama.Masalah lain ketika berhadapan dengan
bytes
danstr
hadir saat bekerja dengan file yang dikembalikan menggunakanopen
fungsi bawaan. Di satu sisi, jika Anda ingin membaca atau menulis data biner ke / dari file, selalu buka file menggunakan mode biner seperti 'rb' atau 'wb'. Di sisi lain, jika Anda ingin membaca atau menulis data Unicode ke / dari file, waspadai penyandian default komputer Anda, jadi jika perlu berikanencoding
parameter untuk menghindari kejutan.Dalam Python 2
str
terdiri dari urutan nilai 8-bit, sedangkanunicode
terdiri dari urutan karakter Unicode. Satu hal yang perlu diingat adalah bahwastr
danunicode
dapat digunakan bersama dengan operator jikastr
hanya terdiri dari karakter ASCI 7-bit.Mungkin bermanfaat untuk menggunakan fungsi pembantu untuk mengkonversi antara
str
danunicode
dalam Python 2, dan antarabytes
danstr
dalam Python 3.sumber
Dari What is Unicode :
Jadi ketika komputer mewakili string, ia menemukan karakter yang tersimpan di komputer string melalui nomor Unicode mereka yang unik dan angka-angka ini disimpan dalam memori. Tetapi Anda tidak dapat secara langsung menulis string ke disk atau mengirimkan string pada jaringan melalui nomor Unicode unik karena angka-angka ini hanyalah angka desimal sederhana. Anda harus menyandikan string ke byte string, seperti
UTF-8
.UTF-8
adalah pengkodean karakter yang mampu mengkodekan semua karakter yang mungkin dan menyimpan karakter sebagai byte (seperti ini ). Jadi string yang disandikan dapat digunakan di mana-mana karenaUTF-8
hampir didukung di mana-mana. Ketika Anda membuka file teks yang dikodekanUTF-8
dari sistem lain, komputer Anda akan mendekode dan menampilkan karakter di dalamnya melalui nomor Unicode unik mereka. Ketika browser menerima data string yang dikodekanUTF-8
dari jaringan, itu akan mendekode data ke string (menganggap browser dalamUTF-8
pengkodean) dan menampilkan string.Di python3, Anda dapat mengubah string dan byte string satu sama lain:
Singkatnya, string adalah untuk ditampilkan kepada manusia untuk dibaca di komputer dan string byte adalah untuk disimpan ke disk dan transmisi data.
sumber
Unicode adalah format yang disepakati untuk representasi biner dari karakter dan berbagai jenis format (misalnya huruf kecil / huruf besar, baris baru, carriage return), dan "hal-hal" lainnya (misalnya emoji). Komputer tidak kurang mampu menyimpan representasi unicode (serangkaian bit), baik dalam memori atau dalam file, daripada menyimpan representasi ascii (serangkaian bit yang berbeda), atau representasi lainnya (serangkaian bit ).
Agar komunikasi dapat terjadi, para pihak dalam komunikasi harus menyetujui perwakilan apa yang akan digunakan.
Karena unicode berusaha mewakili semua karakter yang mungkin (dan "hal-hal" lainnya) yang digunakan dalam komunikasi antar-manusia dan antar-komputer, ia memerlukan jumlah bit yang lebih besar untuk representasi banyak karakter (atau benda) daripada sistem representasi lain yang berusaha untuk mewakili serangkaian karakter / hal yang lebih terbatas. Untuk "menyederhanakan," dan mungkin untuk mengakomodasi penggunaan historis, representasi unicode hampir secara eksklusif dikonversi ke beberapa sistem representasi lainnya (misalnya ascii) untuk tujuan menyimpan karakter dalam file.
Hal ini tidak terjadi yang unicode tidak dapat digunakan untuk menyimpan karakter dalam file, atau mengirimkan mereka melalui setiap saluran komunikasi, hanya bahwa itu adalah tidak.
Istilah "string," tidak didefinisikan secara tepat. "String," dalam penggunaannya yang umum, mengacu pada serangkaian karakter / hal. Di komputer, karakter-karakter itu dapat disimpan dalam salah satu dari banyak representasi bit-demi-bit yang berbeda. "Byte string" adalah sekumpulan karakter yang disimpan menggunakan representasi yang menggunakan delapan bit (delapan bit disebut sebagai byte). Karena, akhir-akhir ini, komputer menggunakan sistem unicode (karakter diwakili oleh jumlah variabel byte) untuk menyimpan karakter dalam memori, dan string byte (karakter diwakili oleh byte tunggal) untuk menyimpan karakter ke file, konversi harus digunakan sebelum karakter diwakili dalam memori akan dipindahkan ke penyimpanan dalam file.
sumber
Mari kita memiliki string satu karakter sederhana
'š'
dan menyandikannya ke dalam urutan byte:Untuk tujuan contoh ini, mari kita tampilkan urutan byte dalam bentuk binernya:
Sekarang umumnya tidak mungkin untuk memecahkan kode informasi kembali tanpa mengetahui bagaimana itu dikodekan. Hanya jika Anda tahu bahwa
utf-8
penyandian teks digunakan, Anda dapat mengikuti algoritme untuk mendekode utf-8 dan mendapatkan string asli:Anda dapat menampilkan nomor biner
101100001
kembali sebagai string:sumber
Bahasa Python termasuk
str
danbytes
sebagai standar "Tipe Built-in". Dengan kata lain, mereka berdua kelas. Saya pikir tidak ada gunanya mencoba merasionalisasi mengapa Python diimplementasikan dengan cara ini.Karena itu,
str
danbytes
sangat mirip satu sama lain. Keduanya memiliki sebagian besar metode yang sama. Metode berikut unik untukstr
kelas:Metode berikut unik untuk
bytes
kelas:sumber