- UTF-8 adalah metode encoding dengan panjang variabel yang mampu merepresentasikan jutaan karakter sambil tetap mempertahankan kompatibilitas mundur dengan ASCII
- Area 7-bit yang sama dengan ASCII (
U+0000~U+007F) menggunakan 1 byte apa adanya, sehingga file ASCII otomatis menjadi file UTF-8 yang valid
- Karakter lainnya direpresentasikan sebagai urutan 2~4 byte, dengan pola bit pada byte pertama menentukan panjangnya dan byte-byte berikutnya diawali
10 untuk menandakan bahwa itu adalah byte lanjutan
- Berkat desain ini, UTF-8 dapat menangani himpunan karakter universal sekaligus tetap sepenuhnya kompatibel dengan sistem ASCII yang sudah ada, sehingga menjadi encoding karakter yang paling luas digunakan
- Encoding Unicode lain seperti UTF-16 dan UTF-32 tidak menyediakan kompatibilitas ASCII seperti ini
Keunggulan desain UTF-8
- Saat pertama kali mengenal encoding UTF-8, saya sangat terkesan oleh bagaimana ia dapat mencakup jutaan karakter dari berbagai bahasa dan simbol dalam satu sistem, sambil tetap memiliki struktur yang kompatibel dengan ASCII lama
- Pada dasarnya UTF-8 memanfaatkan hingga 32 bit, tetapi ASCII hanya menggunakan 7 bit
- Prinsip desain UTF-8 adalah sebagai berikut
- Semua file yang diencoding dengan ASCII adalah file UTF-8 yang valid
- Semua file UTF-8 yang hanya berisi karakter ASCII adalah file ASCII yang valid
- Gagasan untuk menggabungkan sistem lama yang terbatas pada 128 karakter dengan sistem yang mencakup jutaan karakter benar-benar sangat inovatif
Konsep dasar UTF-8
- UTF-8 adalah encoding karakter dengan panjang variabel (variable-width encoding) yang dirancang untuk merepresentasikan semua karakter dalam himpunan karakter Unicode
- Setiap karakter diencoding dalam 1~4 byte
- 128 karakter pertama (
U+0000~U+007F) disimpan sebagai satu byte, sehingga kompatibilitas mundur dengan ASCII terjaga
- Karakter lainnya diencoding dalam dua, tiga, atau empat byte
- Bit awalan pada byte pertama menentukan jumlah total byte yang diperlukan untuk encoding tersebut
| Pola 1 byte |
Jumlah byte |
Pola seluruh urutan byte |
| 0xxxxxxx |
1 |
0xxxxxxx (ASCII umum) |
| 110xxxxx |
2 |
110xxxxx 10xxxxxx |
| 1110xxxx |
3 |
1110xxxx 10xxxxxx 10xxxxxx |
| 11110xxx |
4 |
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
- Byte ke-2, ke-3, dan ke-4 dalam urutan multibyte selalu dimulai dengan
10, yang menandai dengan jelas bahwa itu adalah byte lanjutan
- Sisa bit dari byte utama dan byte lanjutan digabungkan untuk membentuk satu code point
- Code point adalah pengenal unik untuk karakter Unicode, ditulis dengan awalan "U+" dan angka heksadesimal
- Contoh: code point untuk "A" adalah
U+0041
- Alur menafsirkan karakter dari byte encoding UTF-8 adalah sebagai berikut
- 1. Baca satu byte; jika diawali 0, anggap itu sebagai karakter satu byte (ASCII), gunakan 7 bit sisanya untuk menampilkan karakter, lalu lanjut ke byte berikutnya
- 2. Jika tidak diawali 0, maka
- jika 110, berarti karakter 2 byte dan satu byte berikutnya perlu dibaca
- jika 1110, berarti karakter 3 byte dan dua byte berikutnya perlu dibaca
- jika 11110, berarti karakter 4 byte dan tiga byte berikutnya perlu dibaca
- 3. Dari byte-byte yang telah ditentukan, gabungkan bit-bit selain bit awalan untuk digunakan sebagai nilai biner code point
- 4. Cari code point tersebut dalam himpunan karakter Unicode lalu tampilkan di layar
- 5. Ulangi untuk byte berikutnya
Contoh: karakter Hindi "अ"
- Representasi UTF-8:
11100000 10100100 10000101 (3 byte)
- Byte pertama (
11100000) → menunjukkan bahwa ini adalah karakter 3 byte
- Gabungan bit valid dari tiga byte →
00001001 00000101 = heksadesimal 0x0905
- Code point
U+0905 berarti karakter Devanagari "अ"
Contoh file
-
1. Hey👋 Buddy
- Total terdiri dari 13 byte
- Karakter ASCII (H, e, y, B, u, d, d, y, spasi) → masing-masing 1 byte
- 👋 (U+1F44B) → 4 byte
11110000 10011111 10010001 10001011
- File ini adalah file UTF-8 yang valid, tetapi karena mengandung karakter non-ASCII (emoji), file ini tidak kompatibel sebagai ASCII
-
2. Hey Buddy
- Total 9 byte, semuanya berada dalam rentang ASCII
- Karena itu, file ini sekaligus merupakan file ASCII yang valid dan file UTF-8 yang valid
Perbandingan dengan encoding lain
- Ada beberapa encoding yang menyediakan kompatibilitas dengan ASCII, tetapi tidak digunakan seluas UTF-8
- GB18030 (standar Tiongkok) dan lainnya juga menyediakan kompatibilitas ASCII, tetapi tidak banyak digunakan
- Keluarga ISO/IEC 8859 merupakan ekstensi satu byte (maksimal 256 karakter), sehingga memiliki keterbatasan
- UTF-16/UTF-32 tidak memiliki kompatibilitas ASCII
- 'A' (U+0041): dalam UTF-16 adalah
00 41, dalam UTF-32 adalah 00 00 00 41
Bonus: Playground UTF-8
Belum ada komentar.