Day 2 — Character Encoding: ASCII, Unicode, UTF-8, and Bytes
Catatan dari materiCharacter Encoding. Materi menjelaskan bagaimana komputer merepresentasikan karakter lewat angka dan binary, konsep encoding dan decoding, mapping table, masalah beda character encoding antar komputer, ASCII sebagai standar awal Amerika, keterbatasan ASCII untuk bahasa dunia dan emoji, Unicode/UCS-2, masalah ukuran file, UTF-8 sebagai encoding universal hemat memori, struktur count byte, continuation bits, free bits, serta hubungan charset UTF-8 dengan HTML dan bug tanda tanya/kotak pada teks.
Bug notes
Lupa bahwa whitespace dan simbol juga termasuk karakter
Perilaku parsing, formatting, dan text processing menjadi membingungkan.
Solusi: Anggap setiap unit teks yang terlihat maupun control character sebagai karakter yang direpresentasikan oleh encoding.
Teks berubah menjadi kotak atau tanda tanya karena encoding salah
Karakter tidak bisa dipetakan dengan benar saat decoding.
Solusi: Gunakan UTF-8 secara konsisten dan pastikan file/halaman mendeklarasikan charset yang benar.
Mengira ASCII cukup untuk semua teks
Karakter non-English, karakter Jepang/China, dan emoji tidak bisa direpresentasikan dengan benar oleh ASCII.
Solusi: Pahami Unicode dan gunakan UTF-8 untuk aplikasi modern.
Ukuran file membesar saat setiap karakter memakai fixed 2 bytes
Komentar pembaca
Komentar akan muncul setelah disetujui admin.
Belum ada komentar yang disetujui.
Tulis komentar
Hari ini aku belajar character encoding, yaitu cara komputer merepresentasikan karakter seperti huruf, simbol, spasi, newline, emoji, dan karakter bahasa lain ke dalam bentuk angka, lalu ke binary, lalu ke pola listrik yang bisa diproses komputer.
Materi dimulai dari konsep sebelumnya: komputer tidak benar-benar memahami angka seperti manusia. Komputer bekerja dengan tegangan listrik. Tegangan bisa dianggap sebagai 1, tidak ada tegangan bisa dianggap sebagai 0. Binary sendiri adalah representasi manusia untuk pola listrik tersebut. Kalau angka 13 bisa direpresentasikan menjadi binary, pertanyaan berikutnya adalah: bagaimana komputer merepresentasikan huruf seperti A, kata seperti HELLO, simbol seperti $, spasi, atau emoji?
Ide dasarnya sangat sederhana tetapi kuat: gunakan angka untuk merepresentasikan karakter. Proses mengubah karakter menjadi angka berdasarkan mapping table disebut character encoding. Mapping table adalah tabel yang memetakan karakter ke nomor tertentu. Contohnya, A bisa dipetakan ke 1, B ke 2, C ke 3, dan seterusnya. Huruf kecil bisa ditempatkan setelah huruf besar, lalu simbol seperti tanda seru, tanda tanya, kutip, pagar, dan dolar bisa ditempatkan setelahnya.
Dengan mapping table, komputer bisa mengubah kata seperti HELLO menjadi angka. Misalnya H menjadi 8, E menjadi 5, L menjadi 12, L menjadi 12, O menjadi 15 jika memakai tabel buatan sederhana. Tetapi angka itu belum cukup, karena komputer tetap harus menyimpannya sebagai binary/pola listrik. Jadi karakter → angka → binary → pola listrik. Saat data dibaca kembali, prosesnya dibalik: binary dibaca menjadi angka, lalu angka dikonversi kembali menjadi karakter. Proses balik ini disebut character decoding.
Masalah besar muncul ketika dua komputer memakai mapping table atau character encoding yang berbeda. Komputer A mungkin menganggap H adalah 8, tetapi komputer B bisa memakai tabel lain sehingga angka yang sama dibaca sebagai karakter berbeda. Akibatnya, pesan yang dikirim bisa berubah makna atau tampil kacau. Contoh nyata yang sering terlihat adalah simbol kotak atau tanda tanya ketika sebuah perangkat tidak punya mapping untuk karakter tertentu, misalnya emoji roket yang tidak dikenali oleh encoding/perangkat penerima.
Solusi dari masalah itu adalah standardisasi. Semua komputer perlu memakai standar character encoding yang sama agar karakter yang dikirim dan diterima bisa dibaca konsisten. Dari sinilah muncul ASCII, singkatan dari American Standard Code for Information Interchange. ASCII dibuat oleh peneliti Amerika pada era 1960-an ketika komputer banyak berkembang di Amerika. ASCII menstandarkan mapping table untuk karakter-karakter umum, terutama karakter yang dipakai dalam bahasa Inggris.
Dalam ASCII, huruf besar A tidak dimulai dari 1, tetapi dari 65. Huruf besar berlanjut sampai Z di 90. Huruf kecil a dimulai dari 97 sampai z di 122. Ada jarak di antara huruf besar dan huruf kecil karena rancangan bit-nya dibuat pintar: jika beberapa bit depan diabaikan, sistem masih bisa mengenali huruf yang sama tanpa peduli besar/kecil. Ini berhubungan dengan konsep case sensitive dan case insensitive. Sistem seperti Windows secara historis lebih case-insensitive, sedangkan Mac lebih case-sensitive.
ASCII sangat populer, tetapi punya keterbatasan besar. ASCII hanya memakai 7 bit, sehingga hanya bisa merepresentasikan 2^7 atau 128 karakter. Jumlah ini cukup untuk bahasa Inggris dasar dan beberapa simbol, tetapi tidak cukup untuk karakter China, Jepang, Hiragana, Katakana, Kanji, bahasa lain di dunia, apalagi emoji. Ketika komputer mulai menyebar ke seluruh dunia, ASCII tidak lagi cukup.
Karena itu dibutuhkan encoding baru yang universal: Unicode. Unicode dibuat agar karakter dari banyak bahasa dan simbol dunia bisa direpresentasikan dalam satu standar. Unicode harus universal tetapi juga backward compatible dengan ASCII, supaya data lama berbasis ASCII tidak rusak. Salah satu bentuk awal Unicode adalah UCS-2, singkatan dari Universal Character Set 2 bytes. Dengan 2 bytes atau 16 bit, UCS-2 bisa merepresentasikan 2^16 atau 65.536 karakter.
UCS-2 menyelesaikan masalah jumlah karakter, tetapi menciptakan masalah baru: ukuran file. Jika teks ASCII yang tadinya cukup memakai 1 byte per karakter disimpan dalam UCS-2, ukurannya bisa menjadi dua kali lipat karena setiap karakter memakai 2 bytes. Ini boros storage dan memory, terutama untuk teks yang mayoritas masih memakai karakter ASCII biasa.
Solusi yang lebih efisien adalah UTF-8. UTF-8 adalah character encoding yang sangat banyak dipakai di komputer, HP, web, HTML, dan sistem modern. UTF-8 bisa merepresentasikan banyak karakter dunia, tetapi tetap hemat memori. Untuk karakter 0 sampai 127, UTF-8 memakai 1 byte dan sama persis dengan ASCII. Ini membuat UTF-8 backward compatible dengan ASCII. Kalau karakter tidak cukup direpresentasikan dengan 1 byte, UTF-8 dapat memakai 2, 3, atau lebih byte sesuai kebutuhan.
Struktur UTF-8 memakai beberapa konsep penting. Pertama adalah count byte, yaitu byte awal yang menandakan berapa panjang byte untuk karakter tersebut. Di dalam count byte ada size bits, misalnya pola awal tertentu menunjukkan bahwa karakter ini memakai 2 bytes atau 3 bytes. Byte berikutnya disebut data byte. Data byte diawali continuation bits, biasanya pola 10, untuk menandakan bahwa byte tersebut masih bagian dari karakter yang sama, bukan data baru yang terpisah. Bagian yang benar-benar menyimpan nilai karakter disebut free bits.
Demo materi menunjukkan bahwa file teks berisi ABC saat dilihat dengan xxd/hex dump akan tampil sebagai nilai yang sama dengan ASCII karena ABC masih masuk range 0–127. Namun ketika karakter China seperti 我 dimasukkan, UTF-8 memakai beberapa byte. Count byte, continuation bits, dan free bits bisa dilihat dari representasi binary-nya. Jika free bits digabung dan dikonversi ke decimal, nilainya cocok dengan Unicode code point karakter tersebut.
Materi juga menjelaskan kenapa di HTML sering ada meta charset UTF-8. Tulisan charset UTF-8 memberi tahu browser bahwa binary/bytes di file HTML harus didecode memakai UTF-8. Jika charset salah, karakter bisa rusak, berubah menjadi simbol aneh, atau muncul tanda tanya/kotak. Jadi charset bukan dekorasi; itu instruksi decoding yang penting.
Q&A memperjelas bahwa spasi, enter/newline, copyright, trademark, dan emoji juga termasuk karakter. Semua punya nomor/code point di Unicode atau mapping di encoding. Satu bit adalah satu digit binary, sedangkan satu byte adalah 8 bit. Untuk karakter di bawah 127, UTF-8 tidak perlu marker khusus seperti size bits tambahan karena sama seperti ASCII. Untuk karakter lebih besar, UTF-8 menambah byte dengan marker agar komputer tahu byte-byte itu masih satu karakter.
Kesimpulannya, character encoding adalah fondasi penting untuk memahami teks di komputer. Tanpa encoding, komputer tidak tahu bagaimana mengubah karakter menjadi angka dan binary. ASCII adalah standar awal yang penting tetapi terbatas. Unicode memperluas cakupan karakter secara global. UTF-8 menjadi solusi modern karena universal, kompatibel dengan ASCII, dan hemat memori. Sebagai programmer, memahami encoding membantu saat menghadapi bug karakter rusak, tanda tanya/kotak, HTML charset, file text, emoji, dan data multilingual.
Count byte memberi tahu berapa byte yang digunakan untuk merepresentasikan karakter tertentu.
• ASCII menstandarkan character encoding awal ASCII menyamakan mapping table untuk komputer Amerika dan karakter bahasa Inggris dasar.
• Perbedaan mapping table bisa merusak teks Jika dua komputer memakai encoding berbeda, angka yang sama bisa dibaca sebagai karakter berbeda.
• Range huruf besar dan huruf kecil ASCII dipisah dengan sengaja Huruf besar A-Z dan huruf kecil a-z ditempatkan pada range berbeda dengan pola bit yang membantu case handling.
• Unicode dibuat sebagai standar karakter universal Unicode bertujuan menampung karakter dunia dan tetap kompatibel dengan ASCII.
• Character encoding memetakan karakter menjadi angka Komputer dapat menyimpan karakter karena setiap karakter dipetakan ke angka melalui mapping table.
• Simbol fallback menandakan mapping karakter tidak ditemukan Kotak atau tanda tanya sering muncul ketika perangkat tidak tahu karakter apa yang harus ditampilkan.
• UCS-2 memperbesar kapasitas tetapi menambah ukuran file UCS-2 memakai 2 bytes per karakter sehingga bisa menyimpan banyak karakter tetapi membuat file lebih besar.
• HTML charset memberi tahu browser cara decoding bytes Meta charset UTF-8 memastikan browser membaca file HTML memakai encoding yang benar.
• Binary merepresentasikan keadaan listrik Komputer bekerja lewat tegangan listrik; binary adalah cara manusia merepresentasikan ada/tidaknya tegangan.
• UTF-8 bersifat variable-length dan efisien UTF-8 memakai 1 byte untuk karakter ASCII dan menambah byte hanya ketika diperlukan.
File teks yang mayoritas berisi karakter ASCII menjadi jauh lebih besar.
Solusi: Gunakan UTF-8 variable-length agar karakter umum range ASCII tetap 1 byte dan karakter besar memakai byte tambahan seperlunya.