Apa perbedaan antara UTF-8 dan ISO-8859-1 ?
Apa perbedaan antara UTF-8 dan ISO-8859-1 ?
Jawaban:
UTF-8 adalah pengkodean multibyte yang dapat mewakili karakter Unicode. ISO 8859-1 adalah pengodean bita tunggal yang dapat mewakili 256 karakter Unicode pertama. Keduanya menyandikan ASCII dengan cara yang persis sama.
Wikipedia menjelaskan keduanya dengan cukup baik: UTF-8 vs Latin-1 (ISO-8859-1). Yang pertama adalah pengodean panjang variabel, pengodean panjang byte tunggal yang terakhir. Latin-1 mengkodekan hanya 256 poin kode pertama dari set karakter Unicode, sedangkan UTF-8 dapat digunakan untuk menyandikan semua poin kode. Pada tingkat pengkodean fisik, hanya titik kode 0 - 127 yang dapat dikodekan secara identik; poin kode 128 - 255 berbeda dengan menjadi urutan 2-byte dengan UTF-8 sedangkan mereka adalah byte tunggal dengan Latin-1.
UTF adalah keluarga skema multi-byte encoding yang dapat mewakili titik kode Unicode yang dapat mewakili hingga 2 ^ 31 [sekitar 2 miliar] karakter. UTF-8 adalah sistem pengkodean fleksibel yang menggunakan antara 1 dan 4 byte untuk mewakili 2 ^ 21 poin kode [2 juta] pertama.
Singkat cerita: karakter apa pun dengan titik kode / representasi ordinal di bawah 127, alias ASCII 7-bit diwakili oleh urutan 1-byte yang sama seperti kebanyakan pengkodean byte tunggal lainnya. Setiap karakter dengan titik kode di atas 127 diwakili oleh urutan dua atau lebih byte, dengan rincian penyandian dijelaskan di sini .
ISO-8859 adalah rangkaian skema pengodean bita tunggal yang digunakan untuk mewakili huruf yang dapat direpresentasikan dalam kisaran 127 hingga 255. Berbagai huruf ini didefinisikan sebagai "bagian" dalam format ISO-8859- n , yang paling dikenal dari ini kemungkinan adalah ISO-8859-1 alias 'Latin-1'. Seperti halnya UTF-8, ASCII 7-bit-safe tetap tidak terpengaruh terlepas dari keluarga pengkodean yang digunakan.
Kelemahan dari skema pengkodean ini adalah ketidakmampuannya untuk mengakomodasi bahasa yang terdiri dari lebih dari 128 simbol, atau untuk menampilkan lebih dari satu keluarga simbol secara aman pada satu waktu. Selain itu, penyandian ISO-8859 tidak disukai dengan munculnya UTF. "Kelompok Kerja" ISO yang bertanggung jawab atas pembubarannya pada tahun 2004, menyerahkan pemeliharaan kepada subkomite induknya.
ASCII: 7 bit. 128 poin kode.
ISO-8859-1: 8 bit. 256 poin kode.
UTF-8: 8-32 bit (1-4 byte). 1.112.064 poin kode.
ISO-8859-1 dan UTF-8 Baik kompatibel dengan ASCII, tetapi UTF-8 tidak kompatibel dengan ISO-8859-1:
#!/usr/bin/env python3
c = chr(0xa9)
print(c)
print(c.encode('utf-8'))
print(c.encode('iso-8859-1'))
Keluaran:
©
b'\xc2\xa9'
b'\xa9'
ISO-8859-1 adalah standar lama sejak 1980-an. Itu hanya dapat mewakili 256 karakter sehingga hanya cocok untuk beberapa bahasa di dunia barat. Bahkan untuk banyak bahasa yang didukung, beberapa karakter hilang. Jika Anda membuat file teks dalam pengkodean ini dan mencoba menyalin / menempelkan beberapa karakter Cina, Anda akan melihat hasil yang aneh. Jadi dengan kata lain, jangan gunakan itu. Unicode telah mengambil alih dunia dan UTF-8 menjadi standar akhir-akhir ini kecuali Anda memiliki beberapa alasan warisan (seperti header HTTP yang perlu kompatibel dengan semuanya).
Dari perspektif lain, file yang kedua unicode dan ascii encoding gagal dibaca karena mereka memiliki byte 0xc0
di dalamnya, tampaknya bisa dibaca oleh iso-8859-1 dengan benar. Peringatannya adalah bahwa file tersebut seharusnya tidak memiliki karakter unicode di dalamnya tentu saja.
Satu hal yang lebih penting untuk disadari: jika Anda lihat iso-8859-1
, itu mungkin merujuk ke Windows-1252 daripada ISO / IEC 8859-1 . Mereka berbeda dalam kisaran 0x80-0x9F, di mana ISO 8859-1 memiliki kode kontrol C1, dan Windows-1252 memiliki karakter yang terlihat berguna.
Misalnya, ISO 8859-1 memiliki 0x85 sebagai karakter kontrol (dalam Unicode, U + 0085, ``), sedangkan Windows-1252 memiliki elipsis horizontal (dalam Unicode, U + 2026 HORIZONTAL ELLIPSIS, …
).
The WHATWG Encoding spek (seperti yang digunakan oleh HTML) tegas menyatakan iso-8859-1
untuk menjadi label untuk windows-1252
, dan web browser tidak mendukung ISO 8859-1 dengan cara apapun: spec HTML mengatakan bahwa semua pengkodean dalam Encoding spesifikasi harus didukung, dan tidak ada lagi .
Yang juga menarik, referensi karakter numerik HTML pada dasarnya menggunakan Windows-1252 untuk nilai 8-bit daripada titik kode Unicode; per https://html.spec.whatwg.org/#numeric-character-reference-end-state , …
akan menghasilkan U + 2026 daripada U + 0085.
Alasan saya untuk meneliti pertanyaan ini adalah dari perspektif, apakah mereka cocok. Charset Latin1 (iso-8859) adalah 100% kompatibel untuk disimpan dalam datastore utf8. Semua karakter ascii & extended-ascii akan disimpan sebagai byte tunggal.
Pergi ke arah lain, dari utf8 ke Latin1 charset mungkin atau mungkin tidak berfungsi. Jika ada karakter 2-byte (karakter di luar extended-ascii 255), karakter tersebut tidak akan disimpan dalam datastore Latin1.