Apa perbedaan antara UTF-8 dan ISO-8859-1?

Jawaban:

321

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.

Ignacio Vazquez-Abrams
sumber
11
Satu hal yang perlu diperhatikan bahwa ASCII hanya berlaku dari 0 hingga 127 saja. MSB selalu 0.
Hritik
3
Ketika titik kode di atas 127 ditentukan, sistem pengkodean adalah versi ASCII Diperpanjang.
Rohan Bhale
1
@RohanBhale Jangan gunakan frase Extended ASCII; itu hanya akan menyebabkan kebingungan.
Tuan Lister
Tetapi ascii yang diperluas mungkin istilah yang tepat. Saya membacanya di beberapa sumber
Rohan Bhale
135

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.

StaxMan
sumber
@mu mungkin pernyataan saya ambigu, tetapi tidak salah - saya tidak berbicara tentang urutan byte yang dikodekan, melainkan set karakter yang dikodekan; artinya ISO-8859-1 digunakan untuk mengkodekan 256 poin kode pertama dari rangkaian karakter Unicode.
StaxMan
Klarifikasi Anda bekerja untuk saya dan "ambigu" akan menjadi pilihan kata yang lebih baik daripada "salah".
mu terlalu pendek
83

UTF

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

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.

Sammitch
sumber
1
+1 untuk menjawab pertanyaan tetapi melampaui dan menawarkan info tentang penyandian terkait. Re: poin kode untuk UTF-8, menurut stackoverflow.com/a/38488358/3353984 , UTF-8 mendukung 2 ^ 21 poin kode. Apakah itu kesalahan, atau mungkin perbaikan diperlukan di sini?
Tom Loredo
1
Unicode sebenarnya 17 pesawat 2 ^ 16 poin kode. 0x00_0000 hingga 0x1F_FFFF. 17 pesawat dapat menampung 1.114.112 poin kode. Dari jumlah tersebut, 2.048 adalah pengganti, 66 adalah non-karakter, dan 137.468 dicadangkan untuk penggunaan pribadi, menyisakan 974.530 untuk penugasan publik. Sekitar 1 juta. Lihat Berapa banyak karakter yang dapat dikodekan oleh UTF-8? .
georgeawg
22
  • 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'
Cyker
sumber
21

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).

Shital Shah
sumber
1
Saya telah melihat di mana Umlaut seharusnya tidak dikonversi dengan UTF8. Kami melihat contoh ini dan dalam pencarian kami menemukan ISO-8859-1 dan sepertinya berfungsi. Kami memiliki banyak Ilmuwan Jerman yang bekerja dengan kami.
Aggie Jon dari 87
4
Umlaut's direpresentasikan sebagai dua karakter dalam utf8. Mereka bertobat dengan baik dan bekerja dengan baik. Masalahnya berasal dari program yang mengharapkan 1 byte per karakter. Untuk program lawas ini, ISO-8859-1 memiliki umlaut 1-byte.
Erik Aronesty
3

Dari perspektif lain, file yang kedua unicode dan ascii encoding gagal dibaca karena mereka memiliki byte 0xc0di dalamnya, tampaknya bisa dibaca oleh iso-8859-1 dengan benar. Peringatannya adalah bahwa file tersebut seharusnya tidak memiliki karakter unicode di dalamnya tentu saja.

Nikhil VJ
sumber
2

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-1untuk 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.

Chris Morgan
sumber
Ups! Kupikir aku menulis itu, tapi aku kehilangan itu dalam penulisan ulang. Saya sudah memasukkannya sekarang.
Chris Morgan
0

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.

Alan Jurgensen
sumber
2
Bermanfaat, tapi saya pikir maksud Anda 127 bukan 255 dalam extended-ascii 255?
Hydroper
18
Latin-1, atau iso-8859-1 tidak 100% kompatibel untuk disimpan dalam utf8. Karakter Latin-n atau iso-8859-n di atas 127 tidak akan diterjemahkan ke karakter byte tunggal utf-8. Namun, untuk nilai 1-127, mereka akan menerjemahkan dengan tepat.
Marlin Pierce
4
Jawaban ini agak membingungkan dalam penggunaan istilah "extended ascii", yang hanya merupakan istilah untuk merujuk ke pengkodean karakter apa pun yang bukan ASCII. UTF-8 dan latin-1 adalah contoh pengkodean extended-ASCII. Namun, karakter latin-1 non-ascii (mis. Titik kode di atas 127) tidak dapat dikodekan sebagai byte tunggal di UTF-8.
rdb