Apa keuntungan memilih pengkodean ASCII dari pada UTF-8?

91

Semua karakter dalam ASCII dapat dikodekan menggunakan UTF-8 tanpa peningkatan penyimpanan (keduanya membutuhkan byte penyimpanan).

UTF-8 memiliki manfaat tambahan dukungan karakter di luar "ASCII-karakter". Jika itu yang terjadi, mengapa akan kita pernah memilih ASCII encoding lebih UTF-8?

Apakah ada use case ketika kita akan memilih ASCII bukan UTF-8?

Pacerier
sumber
9
Untuk mendukung barang-barang warisan ...
fretje
9
maksud saya UTF8 juga mendukung ASCII. jadi bahkan jika Anda harus mendukung hal-hal warisan, UTF8 akan berfungsi dengan baik tidak ada perubahan lain yang diperlukan
Pacerier
3
Mungkin Anda harus beroperasi dengan sistem yang mengemas 8 karakter ASCII menjadi 7 byte? Orang-orang melakukan hal-hal gila untuk menyesuaikan hal-hal.
Donal Fellows
4
Panggil aku gila, tapi aku akan mengatakan keamanan dan stabilitas. Kumpulan karakter tanpa urutan multi-byte jauh lebih sulit untuk dipecahkan. Jangan salah paham, ketika dukungan bahasa manusia penting ASCII tidak akan memotongnya. Tetapi jika Anda hanya melakukan beberapa pemrograman dasar dan dapat memeras diri Anda ke dalam bahasa asli yang ditulis oleh kompiler dan sistem operasi, mengapa menambah kerumitannya? @Donal Fellows. Terakhir saya periksa ... ASCII adalah 7 byte. (apa pun dengan bit ekstra itu bukan ASCII dan meminta masalah)
ebyrob
2
@ebyrob Saya pikir Donal Fellows berarti mengemas 8 simbol ascii menjadi 7 byte, karena masing-masing simbol menggunakan 7 bit masing-masing ... 8 * 7 = 56 bit = 7 byte. Ini akan berarti fungsi encode dan decode khusus, hanya untuk menghemat 1 byte penyimpanan dari setiap 8.
dodgy_coder

Jawaban:

83

Dalam beberapa kasus dapat mempercepat akses ke karakter individu. Bayangkan string yang str='ABC'dikodekan dalam UTF8 dan ASCII (dan dengan asumsi bahwa bahasa / kompiler / database tahu tentang pengkodean)

Untuk mengakses Ckarakter ketiga ( ) dari string ini menggunakan operator akses-array yang ditampilkan dalam banyak bahasa pemrograman Anda akan melakukan sesuatu seperti c = str[2].

Sekarang, jika string dikodekan ASCII, yang perlu kita lakukan adalah mengambil byte ketiga dari string.

Namun, jika string dikodekan UTF-8, kita harus terlebih dahulu memeriksa apakah karakter pertama adalah karakter satu atau dua byte, maka kita perlu melakukan pemeriksaan yang sama pada karakter kedua, dan hanya dengan begitu kita dapat mengakses karakter ketiga. Perbedaan kinerja akan semakin besar, semakin lama string.

Ini adalah masalah misalnya di beberapa mesin database, di mana untuk menemukan awal kolom ditempatkan 'setelah' UTF-8 disandikan VARCHAR, database tidak hanya perlu memeriksa berapa banyak karakter yang ada di bidang VARCHAR, tetapi juga bagaimana banyak byte yang digunakan masing-masing.

Mchl
sumber
3
Jika database tidak menyimpan "jumlah karakter" dan "jumlah byte", maka saya akan mengatakan itu punya beberapa masalah ...
Dean Harding
1
TBH Saya tahu tidak ada database yang akan menyimpan ...
Mchl
@ Mcch: bagaimana Anda membayangkan database tahu kapan telah mencapai akhir dari string?
kevin cline
1
Biasanya dengan mencapai 0x00 atau 0x0000
Mchl
4
@DeanHarding Bagaimana cara menghitung karakter memberi tahu Anda di mana karakter kedua dimulai? Atau haruskah database menyimpan indeks untuk setiap karakter juga diimbangi? Catatan: Ini bukan hanya 2 karakter, tetapi bisa sampai 4 (kecuali bila 6) stackoverflow.com/questions/9533258/… . (Saya pikir itu hanya utf-16 yang memiliki kekejian yang sangat panjang yang dapat menghancurkan sistem Anda)
ebyrob
7

Jika Anda hanya akan menggunakan subset US-ASCII (atau ISO 646) dari UTF-8, maka tidak ada keuntungan nyata untuk satu atau yang lain; pada kenyataannya, semuanya dikodekan secara identik.

Jika Anda akan melampaui rangkaian karakter US-ASCII, dan menggunakan (misalnya) karakter dengan aksen, umlaut, dll., Yang digunakan dalam bahasa Eropa barat yang khas, maka ada perbedaan - sebagian besar masih dapat dikodekan dengan satu byte dalam ISO 8859, tetapi akan membutuhkan dua atau lebih byte ketika dikodekan dalam UTF-8. Ada juga, tentu saja, kerugian: ISO 8859 mengharuskan Anda menggunakan beberapa cara keluar dari band untuk menentukan pengkodean yang digunakan, dan itu hanya mendukung satudari bahasa-bahasa ini sekaligus. Misalnya, Anda dapat menyandikan semua karakter alfabet Cyrillic (Rusia, Belorusia, dll.) Hanya menggunakan satu byte saja, tetapi jika Anda perlu / ingin mencampurnya dengan karakter Prancis atau Spanyol (selain yang ada di AS-ASCII / ISO 646 subset) Anda kurang beruntung - Anda harus benar-benar mengubah set karakter untuk melakukan itu.

ISO 8859 benar-benar hanya berguna untuk huruf Eropa. Untuk mendukung sebagian besar huruf yang digunakan di sebagian besar huruf Cina, Jepang, Korea, Arab, dll., Anda harus menggunakan beberapa penyandian yang sama sekali berbeda. Beberapa di antaranya (Misalnya, Shift JIS untuk Jepang) sangat menyakitkan untuk dihadapi. Jika ada kemungkinan Anda ingin mendukung mereka, saya akan menganggap perlu menggunakan Unicode untuk berjaga-jaga.

Jerry Coffin
sumber
5

ANSI dapat berupa banyak hal, sebagian besar merupakan rangkaian karakter 8 bit dalam hal ini (seperti kode halaman 1252 di Windows).

Mungkin Anda memikirkan ASCII yang 7-bit dan bagian yang tepat dari UTF-8. Yaitu setiap aliran ASCII yang valid juga merupakan aliran UTF-8 yang valid.

Jika Anda berpikir tentang rangkaian karakter 8-bit, satu keuntungan yang sangat penting adalah bahwa semua karakter yang dapat diwakili adalah 8-bit tepatnya, di mana dalam UTF-8 mereka dapat mencapai 24 bit.


sumber
ya saya sedang berbicara tentang set ASCII 7-bit. dapatkah Anda memikirkan 1 keuntungan yang perlu kami simpan sebagai ascii alih-alih utf-8? (karena 7-bit akan tetap disimpan sebagai 8-bit, ukuran file akan persis sama)
Pacerier
1
Jika Anda memiliki karakter lebih besar dari nilai unicode 127, mereka tidak dapat disimpan dalam ASCII.
1
@Pacerier: Setiap string ASCII adalah string UTF-8 , jadi tidak ada perbedaan . Pengkodean rutin mungkin lebih cepat tergantung pada representasi string dari platform yang Anda gunakan, meskipun saya tidak akan mengharapkan peningkatan yang signifikan, sementara Anda memiliki kerugian yang signifikan dalam fleksibilitas.
back2dos
@Tor itulah sebabnya saya bertanya apakah menabung sebagai ASCII memiliki kelebihan sama sekali
Pacerier
5
@Pacerier, jika Anda menyimpan XML sebagai ASCII, Anda harus menggunakan mis. & # 160; untuk ruang yang tidak mudah pecah. Ini lebih mengisi, tetapi membuat data Anda lebih tahan terhadap kesalahan pengkodean ISO-Latin-1 vs UTF-8. Inilah yang kami lakukan karena platform kami melakukan banyak sihir tak terlihat dengan karakter. Tetap di ASCII membuat data kami lebih kuat.
3

Ya, masih ada beberapa kasus penggunaan di mana ASCII masuk akal: format file dan protokol jaringan . Secara khusus, untuk penggunaan di mana:

  • Anda memiliki data yang dihasilkan dan dikonsumsi oleh program komputer, tidak pernah disajikan kepada pengguna akhir;
  • Tetapi yang bermanfaat bagi programmer untuk bisa membaca, untuk kemudahan pengembangan dan debugging.

Dengan menggunakan ASCII sebagai encoding Anda, Anda menghindari kerumitan multi-byte encoding sambil mempertahankan setidaknya beberapa keterbacaan manusia.

Beberapa contoh:

  • HTTP adalah protokol jaringan yang didefinisikan dalam urutan urutan oktet, tetapi sangat berguna (setidaknya untuk programmer yang berbahasa Inggris) yang sesuai dengan pengkodean kata-kata ASCII seperti "GET", "POST", "Terima-Bahasa" dan begitu seterusnya.
  • Tipe chunk dalam format gambar PNG terdiri dari empat oktet, tetapi berguna jika Anda memprogram encoder atau decoder PNG yang IDATberarti "data gambar", dan PLTEberarti "palet".

Tentu saja Anda perlu berhati-hati bahwa data benar - benar tidak akan disajikan kepada pengguna akhir, karena jika itu akhirnya terlihat (seperti yang terjadi dalam kasus URL), maka pengguna dengan benar akan mengharapkan data tersebut menjadi dalam bahasa yang bisa mereka baca.

Gareth Rees
sumber
Kata baik. Agak ironis bahwa HTTP, protokol yang mentransmisikan unicode paling di planet ini hanya perlu mendukung ASCII. (Sebenarnya, saya kira hal yang sama berlaku untuk TCP dan IP, dukungan biner, dukungan ASCII ... itu saja yang Anda butuhkan pada tingkat tumpukan itu)
ebyrob
2

Pertama-tama: judul Anda menggunakan / d ANSI, sedangkan dalam teks Anda merujuk ASCII. Harap dicatat bahwa ANSI tidak sama dengan ASCII. ANSI menggabungkan set ASCII. Tetapi set ASCII terbatas pada 128 nilai numerik pertama (0 - 127).

Jika semua data Anda terbatas pada ASCII (7-bit), tidak masalah apakah Anda menggunakan UTF-8, ANSI atau ASCII, karena ANSI dan UTF-8 sesuai dengan set ASCII lengkap. Dengan kata lain: nilai numerik 0 hingga dan termasuk 127 mewakili karakter yang sama persis di ASCII, ANSI dan UTF-8.

Jika Anda memerlukan karakter di luar rangkaian ASCII, Anda harus memilih penyandian. Anda bisa menggunakan ANSI, tetapi kemudian Anda mengalami masalah dari semua halaman kode yang berbeda. Buat file di mesin A dan baca di mesin B mungkin / akan menghasilkan teks yang tampak lucu jika mesin ini diatur untuk menggunakan halaman kode yang berbeda, sederhana karena nilai numerik nnn mewakili karakter yang berbeda di halaman kode ini.

"Halaman kode ini" adalah alasan mengapa standar Unicode didefinisikan. UTF-8 hanyalah satu pengkodean standar itu, ada banyak lagi. UTF-16 menjadi yang paling banyak digunakan karena merupakan pengodean asli untuk Windows.

Jadi, jika Anda perlu mendukung apa pun di luar 128 karakter set ASCII, saran saya adalah menggunakan UTF-8 . Dengan begitu, itu tidak masalah dan Anda tidak perlu khawatir dengan halaman kode mana pengguna Anda telah mengatur sistem mereka.

Marjan Venema
sumber
jika saya tidak perlu mendukung lebih dari 128 karakter, apa keuntungan memilih pengkodean ACSII daripada pengkodean UTF8?
Pacerier
Selain membatasi diri Anda ke 128 karakter itu? Tidak banyak. UTF-8 secara khusus dirancang untuk memenuhi ASCII dan sebagian besar bahasa barat yang "hanya" membutuhkan ANSI. Anda akan menemukan bahwa UTF-8 hanya akan mengkodekan sejumlah kecil karakter ANSI yang lebih tinggi dengan lebih dari satu byte. Ada alasan mengapa sebagian besar halaman HTML menggunakan UTF-8 sebagai default ...
Marjan Venema
1
@Pacerier, jika Anda tidak perlu melakukan pengkodean di atas 127, memilih ASCII mungkin bernilai ketika Anda menggunakan beberapa API untuk menyandikan / mendekodekan, karena UTF memerlukan verifikasi bit tambahan untuk mempertimbangkan byte tambahan sebagai karakter yang sama, itu dapat mengambil perhitungan tambahan daripada ASCII murni yang hanya membaca 8 bit tanpa verifikasi. Tetapi saya hanya menyarankan Anda untuk menggunakan ASCII jika Anda benar-benar membutuhkan optimasi tingkat tinggi dalam perhitungan besar (besar) dan Anda tahu apa yang Anda lakukan dalam optimasi itu. Jika tidak, gunakan saja UTF-8.
Luciano