Mengapa karakter bahasa Inggris memerlukan byte lebih sedikit untuk diwakili daripada huruf lain?

31

Ketika saya menempatkan 'a' dalam file teks, itu membuatnya 2 byte tetapi ketika saya meletakkan, katakanlah 'ա', yang merupakan huruf dari alfabet Armenia, itu membuatnya menjadi 3 byte.

Apa perbedaan antara huruf untuk komputer?
Mengapa bahasa Inggris tidak memakan banyak tempat?

khajvah
sumber
22
Anda harus membaca artikel ini oleh pendiri StackExchange: joelonsoftware.com/articles/Unicode.html
Eric Lippert
22
Saya tidak berpikir ada yang namanya "karakter bahasa Inggris". Mereka orang Romawi.
Raphael
5
@Raphael semua orang tahu apa yang dia maksud. Tapi tambahkan yang bagus.
Mathias Lykkegaard Lorenzen
1
@Raphael Sebenarnya ada banyak huruf Romawi yang tidak digunakan dalam bahasa Inggris, dan karenanya tidak termasuk dalam rangkaian karakter ASCII. Sebagian besar dari mereka termasuk pengubah, tetapi mereka masih diperlukan untuk membuat teks dengan benar dalam berbagai lagu yang berasal dari Latin selain bahasa Inggris.
Wutaz
7
@ Raphael Saya tidak berpikir ada yang namanya "karakter Romawi". Itu bahasa Latin.
Blacklight Shining

Jawaban:

41

Salah satu skema pengkodean pertama yang dikembangkan untuk digunakan dalam komputer arus utama adalah standar ASCII ( American Standard Code for Information Interchange ). Ini dikembangkan pada 1960-an di Amerika Serikat.

Alfabet bahasa Inggris menggunakan bagian dari abjad Latin (misalnya, ada beberapa kata beraksen dalam bahasa Inggris). Ada 26 huruf individual dalam alfabet itu, tidak mempertimbangkan kasus. Dan juga harus ada nomor individual dan tanda baca dalam skema apa pun yang berpura-pura menyandikan alfabet bahasa Inggris.

Tahun 1960-an juga saat di mana komputer tidak memiliki jumlah memori atau ruang disk yang kita miliki sekarang. ASCII dikembangkan menjadi representasi standar dari alfabet fungsional di semua komputer Amerika. Pada saat itu, keputusan untuk membuat setiap karakter ASCII menjadi 8 bit (1 byte) dibuat karena detail teknis waktu itu (artikel Wikipedia menyebutkan fakta bahwa pita berlubang menahan 8 bit dalam posisi pada suatu waktu). Bahkan, skema ASCII asli dapat ditransmisikan menggunakan 7 bit, delapan dapat digunakan untuk pemeriksaan paritas. Perkembangan selanjutnya memperluas skema ASCII asli untuk memasukkan beberapa aksen, matematika dan karakter terminal.

Dengan meningkatnya penggunaan komputer baru-baru ini di seluruh dunia, semakin banyak orang dari berbagai bahasa memiliki akses ke komputer. Itu berarti bahwa, untuk setiap bahasa, skema penyandian baru harus dikembangkan, terlepas dari skema lain, yang akan bertentangan jika dibaca dari terminal bahasa yang berbeda.

Unicode datang sebagai solusi untuk keberadaan terminal yang berbeda, dengan menggabungkan semua karakter bermakna yang mungkin menjadi satu set karakter abstrak tunggal.

UTF-8 adalah salah satu cara untuk menyandikan kumpulan karakter Unicode. Ini adalah pengodean lebar variabel (mis. Karakter yang berbeda dapat memiliki ukuran yang berbeda) dan dirancang untuk kompatibilitas dengan skema ASCII sebelumnya. Dengan demikian, set karakter ASCII akan tetap menjadi satu byte besar sementara karakter lain dua atau lebih byte besar. UTF-16 adalah cara lain untuk menyandikan kumpulan karakter Unicode. Dibandingkan dengan UTF-8, karakter dikodekan sebagai satu set satu atau dua unit kode 16-bit.

Seperti yang dinyatakan pada komentar, karakter 'a' menempati byte tunggal sementara 'ա' menempati dua byte, yang menunjukkan pengkodean UTF-8. Byte tambahan dalam pertanyaan Anda adalah karena adanya karakter baris baru di akhir (yang diketahui OP).

Doktoro Reichard
sumber
26
Tidak ada byte terakhir yang mengkode akhir file, dalam pengodean atau format file normal. Ketika sebuah program membaca file, akhir file mungkin ditandai oleh OS dengan cara khusus, tapi itu masalah yang berbeda.
Jukka K. Korpela
2
Karakter ա adalah 2 byte (0xD5A1) dalam versi unicode UTF-8; karakter tambahan (apa pun itu) hadir di kedua file. marathon-studios.com/unicode/U0561/Armenian_Small_Letter_Ayb
Dan Neely
6
@khajvah Jika Anda echo 'ա' > file.txt, atau mengedit file menggunakan beberapa editor, mereka secara otomatis menambahkan baris baru setelahnya. Jika Anda menjalankan xxd file.txt, byte terakhir mungkin akan menjadi 0a, atau umpan baris.
Daniel Beck
7
@DoktoroReichard: Tolong jelaskan dalam jawaban bahwa Unicode bukan encoding; alih-alih, ini adalah set karakter abstrak, dan UTF-16 dan UTF-8 adalah pengkodean dari Unicode codepoints. Paragraf terakhir dari jawaban Anda kebanyakan berbicara tentang UTF-8. Tetapi jika file menggunakan UTF-16, maka setiap codepoint, bahkan satu untuk a, akan menggunakan dua byte (atau kelipatan dua).
grawity
6
Mungkin juga perlu ditekankan bahwa rangkaian karakter "extended ASCII" sebenarnya bukan ASCII sama sekali, dan banyaknya cara berbeda untuk memanfaatkan bit kedelapan menjadikannya berantakan. Cukup gunakan UTF-8 saja.
ntoskrnl
17

1 byte adalah 8 bit, dan dengan demikian dapat mewakili hingga 256 (2 ^ 8) nilai yang berbeda.

Untuk bahasa yang membutuhkan lebih banyak kemungkinan daripada ini, pemetaan 1 banding 1 tidak dapat dipertahankan, sehingga diperlukan lebih banyak data untuk menyimpan karakter.

Perhatikan bahwa secara umum, sebagian besar pengkodean menggunakan 7 bit pertama (nilai 128) untuk karakter ASCII . Yang meninggalkan bit 8, atau 128 nilai lebih untuk karakter lebih banyak. . . tambahkan karakter beraksen, bahasa Asia, Cyrillic, dll, dan Anda dapat dengan mudah melihat mengapa 1 byte tidak cukup untuk menjaga semua karakter.

ernie
sumber
jadi inilah satu-satunya jawaban yang benar-benar menjelaskan mengapa lebih banyak ruang digunakan
Félix Gagnon-Grenier
10

Dalam UTF-8, karakter ASCII menggunakan satu byte, karakter lain menggunakan dua, tiga, atau empat byte.

Jason
sumber
1
Bisakah Anda menguraikan mengapa ini? mencatat dua metode pengkodean tidak cukup menjawab pertanyaan.
MaQleod
@MaQleod Unicode dibuat untuk menggantikan ASCII. Untuk kompatibilitas mundur, 128 karakter pertama adalah sama. 128 karakter ini dapat diekspresikan dengan satu byte. Byte tambahan ditambahkan untuk karakter tambahan.
Jason
Saya sadar, tetapi itu adalah bagian dari jawaban untuk pertanyaan tentang apa yang membuat karakter ASCII berbeda. Ini harus dijelaskan kepada OP.
MaQleod
@MaQleod Dapat juga dikatakan bahwa Konsorsium Unicode sebagian besar terdiri dari perusahaan-perusahaan Amerika dan bias terhadap karakter bahasa Inggris. Saya pikir jawaban sederhana lebih baik daripada jawaban subyektif.
Jason
15
Bukan "di Unicode", di UTF8 - yang hanya satu dari beberapa penyandian karakter Unicode.
Sebastian Negraszus
3

Jumlah byte yang diperlukan untuk karakter (yang pertanyaannya jelas tentang) tergantung pada pengkodean karakter. Jika Anda menggunakan penyandian ArmSCII, setiap huruf Armenia hanya menempati satu byte. Tapi ini bukan pilihan yang baik.

Dalam pengkodean transfer UTF-8 untuk Unicode, karakter memerlukan jumlah byte yang berbeda. Di dalamnya, "a" hanya membutuhkan satu byte (ide tentang dua byte adalah semacam kebingungan), "á" membutuhkan dua byte, dan huruf Armenia ayb "ա" juga membutuhkan dua byte. Tiga byte harus menjadi semacam kebingungan. Sebaliknya, misalnya huruf Bengali a "অ" membutuhkan tiga byte dalam UTF-8.

Latar belakangnya sederhana bahwa UTF-8 dirancang agar sangat efisien untuk karakter Ascii, cukup efisien untuk sistem penulisan di Eropa dan sekitarnya, dan yang lainnya kurang efisien. Ini berarti bahwa huruf Latin dasar (yang sebagian besar terdiri dari teks bahasa Inggris), hanya satu byte yang diperlukan untuk sebuah karakter; untuk bahasa Yunani, Sirilik, Armenia, dan beberapa lainnya, diperlukan dua byte; semua yang lain membutuhkan lebih banyak.

UTF-8 telah (seperti yang ditunjukkan dalam komentar) juga properti berguna yang data Ascii (bila direpresentasikan sebagai unit 8-bit, yang telah menjadi satu-satunya cara untuk waktu yang lama) juga disandikan secara UTF-8 juga.

Jukka K. Korpela
sumber
Terima kasih atas jawabannya. Byte tambahan adalah karena program yang saya gunakan secara otomatis menambahkan karakter baris baru ke akhir.
khajvah
1
Saya tidak berpikir UTF-8 dirancang untuk efisiensi dengan data ASCII dan untuk kompatibilitas . UTF-8 memiliki properti yang sangat bagus bahwa konten ASCII 7-bit (dengan bit tinggi yang disetel ke nol) identik dengan konten yang sama yang disandikan sebagai UTF-8, jadi untuk alat yang biasanya menangani ASCII, itu adalah pengganti drop-in . Tidak ada skema pengkodean Unicode lainnya yang memiliki properti itu, setahu saya. UTF-8 juga cukup kompak untuk sebagian besar data, terutama jika Anda tetap berada dalam ranah Unicode BMP .
CVn
1
@ MichaelKjörling, saya telah menambahkan referensi ke fitur itu. Namun, keberatan utama terhadap Unicode pada hari-hari awal adalah inefisiensi, dan UTF-16 menggandakan ukuran data yang dominan adalah Ascii. UTF-8 berarti, misalnya untuk teks bahasa Inggris, bahwa Anda hanya “membayar” untuk karakter non-Ascii yang Anda gunakan.
Jukka K. Korpela
3

Kode karakter pada tahun 1960-an (dan lebih lama lagi) adalah spesifik mesin. Pada 1980-an saya secara singkat menggunakan mesin DEC 2020, yang memiliki 36 bit kata, dan 5, 6 dan 8 ( IIRC ) bit per pengkodean karakter. Sebelum itu, saya menggunakan seri IBM 370 dengan EBCDIC. ASCII dengan 7 bit membawa pesanan, tetapi itu membuat berantakan dengan IBM PC "codepages" menggunakan semua 8 bit untuk mewakili karakter tambahan, seperti segala macam kotak gambar yang melukis menu primitif, dan kemudian ekstensi ASCII seperti Latin-1 (8 bit pengkodean, dengan 7 bit pertama seperti ASCII dan setengah lainnya untuk "karakter nasional" seperti ñ,, Çatau yang lain. Mungkin yang paling populer adalah Latin-1, yang disesuaikan dengan bahasa Inggris dan sebagian besar bahasa Eropa menggunakan karakter Latin (dan aksen dan varian).

Menulis pencampuran teks misalnya bahasa Inggris dan Spanyol berjalan dengan baik (gunakan saja Latin-1, superset keduanya), tetapi mencampur apa pun yang menggunakan pengkodean yang berbeda (katakanlah termasuk cuplikan bahasa Yunani, atau Rusia, belum lagi bahasa asia seperti Jepang) adalah benar-benar mimpi buruk. Yang terburuk adalah bahwa Rusia dan terutama Jepang dan Cina memiliki beberapa pengkodean yang populer dan sepenuhnya tidak kompatibel.

Hari ini kami menggunakan Unicode, yang disandel ke penyandian efisien seperti UTF-8 yang mendukung karakter bahasa Inggris (yang mengejutkan, penyandian untuk huruf-huruf bahasa Inggris sesuai dengan ASCII) sehingga membuat banyak karakter non-Inggris menggunakan penyandian yang lebih lama.

vonbrand
sumber
2

Windows 8.1 US / Bahasa Inggris File dengan satu 'a' disimpan dengan notepad.

  • Simpan AS ANSI 1 byte
  • Simpan AS Unicode 4 byte
  • Simpan AS UTF-8 4 byte

File dengan satu 'ա' disimpan dengan notepad

  • Simpan AS ANSI tidak mungkin
  • Simpan AS Unicode 4 byte
  • Simpan AS UTF-8 5 byte

Satu 'a' dikodekan sebagai satu byte dalam ANSI, dalam Unicode setiap karakter biasanya 2 byte ada juga BOM 2 byte (Byte Order Marker) di awal file. UTF-8 memiliki BOM 3 byte dan karakter byte tunggal.

Untuk 'ա' karakter itu tidak ada di set karakter ANSI dan tidak dapat disimpan di mesin saya. File Unicode sama dengan sebelumnya, dan file UTF-8 1 byte lebih besar karena karakter mengambil 2 byte.

Jika mesin Anda berasal dari wilayah yang berbeda, Anda mungkin memiliki halaman kode OEM berbeda yang diinstal dengan mesin terbang berbeda untuk 255 karakter yang mungkin dalam rentang ASCII. Seperti @ntoskrnl menyebutkan codepage OEM untuk mesin saya adalah Windows-1252 yang merupakan default untuk bahasa Inggris AS.

Darryl Braaten
sumber
4
Notepad (dan Windows secara umum) menggunakan terminologi yang membingungkan di sini. "ANSI" adalah pengkodean byte tunggal yang bergantung pada lokal (Windows-1252 pada versi bahasa Inggris), dan "Unicode" adalah UTF-16.
ntoskrnl
@ntoskrnl Itu benar, tetapi jika Anda mencari di kotak drop untuk pengkodean katanya ANSI, itulah sebabnya saya sebutkan jika Anda memiliki codepage OEM yang berbeda, Anda mungkin mendapatkan hasil yang berbeda.
Darryl Braaten
2

Jika Anda tertarik pada bagaimana karakter disimpan, Anda dapat mengunjungi www.unicode.org dan melihat-lihat. Di bagian atas halaman utama mereka adalah tautan "Daftar Kode" yang menunjukkan semua kode karakter yang tersedia di Unicode.

Secara keseluruhan, ada sedikit lebih dari satu juta kode yang tersedia di Unicode (tidak semuanya digunakan). Satu byte dapat menampung 256 nilai yang berbeda, jadi Anda akan membutuhkan tiga byte jika Anda ingin menyimpan setiap kode Unicode yang mungkin.

Sebaliknya, Unicode biasanya disimpan dalam pengkodean "UTF-8" yang menggunakan byte lebih sedikit untuk beberapa karakter dan lebih banyak untuk yang lain. 128 nilai kode pertama disimpan dalam satu byte, hingga nilai kode 2048 pertama disimpan dalam dua byte, hingga 65536 disimpan dalam tiga byte, dan sisanya mengambil empat byte. Ini telah diatur sehingga nilai kode yang digunakan lebih sering mengambil lebih sedikit ruang. AZ, az, 0-9 dan! @ $% ^ & * () - [} {}; ': "|,. / <>? Dan beberapa yang saya lupa ambil satu byte; hampir semua bahasa Inggris, 98% dari Jerman dan Prancis (hanya menebak) dapat disimpan dalam satu byte per karakter, dan ini adalah karakter yang paling banyak digunakan. Sirilik, Yunani, Ibrani, Arab dan beberapa lainnya menggunakan dua byte per karakter. Bahasa India, sebagian besar Cina, Jepang , Korea, Thailand, banyak simbol matematika, dapat ditulis dalam tiga byte per karakter. Hal-hal yang jarang (jika Anda ingin menulis teks dalam Linear A atau Linear B, Emoji) membutuhkan empat byte.

Pengkodean lainnya adalah UTF-16. Segala sesuatu yang membutuhkan 1, 2 atau 3 byte dalam UTF-8 membutuhkan dua byte dalam UTF-16. Itu keuntungan jika Anda memiliki teks Cina atau Jepang dengan sangat sedikit karakter latin di antaranya.

Tentang alasan desain UTF-8: Ini memiliki beberapa keunggulan dibandingkan desain lainnya. Mereka:

Kompatibilitas dengan karakter US-ASCII

Kekompakan yang wajar

Sinkronisasi sendiri: Ini berarti bahwa jika Anda diberikan bagian dari urutan byte yang merupakan karakter dalam pengkodean UTF-8, Anda dapat mengetahui di mana karakter dimulai. Dalam beberapa pengkodean, baik xy dan yx bisa menjadi pengkodean karakter yang valid, jadi jika Anda diberikan bagian dari urutan ... xyxyxyxyxyxyxy ... Anda tidak dapat mengetahui karakter apa yang Anda miliki.

Mengurutkan kebenaran: Jika Anda mengurutkan string yang mengandung karakter yang dikodekan UTF-8 berdasarkan nilai byte mereka, maka mereka secara otomatis diurutkan dengan benar sesuai dengan nilai Unicode mereka.

Kompatibel dengan kode byte tunggal: Sebagian besar kode yang mengasumsikan nilai byte tunggal berfungsi secara otomatis dengan karakter yang dikodekan UTF-8.

Ditambah alasan apa pun yang saya lupa.

gnasher729
sumber