Apa Itu Encoding Unicode?
Unicode adalah standar encoding karakter universal yang memberikan nomor unik — yang disebut code point — untuk setiap karakter yang digunakan dalam bahasa manusia. Sebelum Unicode, ada puluhan sistem encoding yang tidak kompatibel. Dokumen yang ditulis dalam bahasa Rusia di satu sistem tidak dapat dibaca di sistem lain. Unicode mengatasi ini dengan menyediakan set karakter tunggal yang terpadu yang mencakup lebih dari 150 aksara dan 140.000 karakter.
Unicode sendiri bukanlah sebuah encoding. Ini adalah repertoire karakter. Lapisan encoding — bagaimana code points disimpan sebagai byte — ditangani oleh bentuk encoding seperti UTF-8, UTF-16, dan UTF-32. Memahami perbedaan antara code point dan representasi byte-nya adalah kunci untuk menghindari bug encoding.
Code Points
Setiap karakter Unicode memiliki code point yang ditulis sebagai U+ diikuti dengan angka heksadesimal. Huruf A adalah U+0041, tanda euro adalah U+20AC, dan emoji 😀 adalah U+1F600.
Code points diorganisasikan ke dalam 17 bidang (plane), masing-masing berisi 65.536 karakter. Bidang pertama (Bidang 0) adalah Basic Multilingual Plane (BMP), yang berisi karakter paling umum termasuk Latin, Yunani, Sirilik, CJK, dan banyak lainnya. Bidang 1 hingga 16 berisi karakter tambahan seperti emoji, aksara sejarah, dan karakter CJK langka.
| Bidang | Rentang | Nama |
|---|---|---|
| 0 | U+0000 hingga U+FFFF | Basic Multilingual Plane (BMP) |
| 1 | U+10000 hingga U+1FFFF | Supplementary Multilingual Plane (SMP) |
| 2 | U+20000 hingga U+2FFFF | Supplementary Ideographic Plane (SIP) |
| 3-13 | U+30000 hingga U+DFFFF | Belum ditetapkan |
| 14 | U+E0000 hingga U+EFFFF | Supplementary Special-purpose Plane (SSP) |
| 15-16 | U+F0000 hingga U+10FFFF | Private Use Planes |
UTF-8, UTF-16, UTF-32
Ketiga bentuk encoding ini berbeda dalam cara mereka memetakan code points ke byte.
UTF-8
UTF-8 adalah encoding yang dominan di web. Ini menggunakan 1 hingga 4 byte per karakter dan kompatibel mundur dengan ASCII. Karakter dalam rentang ASCII (U+0000 hingga U+007F) menggunakan satu byte. Aksara Eropa menggunakan dua byte. Karakter CJK dan emoji menggunakan tiga atau empat byte.
| Rentang Code Point | Byte 1 | Byte 2 | Byte 3 | Byte 4 |
|---|---|---|---|---|
| U+0000 - U+007F | 0xxxxxxx | |||
| U+0080 - U+07FF | 110xxxxx | 10xxxxxx | ||
| U+0800 - U+FFFF | 1110xxxx | 10xxxxxx | 10xxxxxx | |
| U+10000 - U+10FFFF | 11110xxx | 10xxxxxx | 10xxxxxx | 10xxxxxx |
Kelebihan UTF-8:
- Teks ASCII adalah UTF-8 yang valid (tidak perlu konversi)
- Self-synchronising: Anda selalu dapat menemukan batas karakter
- Tidak ada masalah urutan byte (little-endian / big-endian)
- Paling hemat ruang untuk teks aksara Latin
UTF-16
UTF-16 menggunakan 2 byte (satu unit kode) untuk karakter BMP dan 4 byte (dua unit kode, disebut pasangan pengganti) untuk karakter tambahan. Windows, Java, dan JavaScript menggunakan UTF-16 secara internal.
UTF-16 memiliki masalah urutan byte. File UTF-16 harus menentukan apakah itu little-endian (UTF-16LE) atau big-endian (UTF-16BE), biasanya menggunakan BOM (Byte Order Mark) di awal.
UTF-32
UTF-32 menggunakan tepat 4 byte untuk setiap code point. Ini sederhana tetapi boros. File ASCII murni menjadi empat kali lebih besar. UTF-32 jarang digunakan dalam praktik.
Perbandingan
| Fitur | UTF-8 | UTF-16 | UTF-32 |
|---|---|---|---|
| Byte per karakter | 1-4 | 2 atau 4 | 4 |
| Kompatibilitas ASCII | Ya | Tidak | Tidak |
| Penggunaan web | ~98% | ~2% | <0,01% |
| BOM diperlukan | Tidak | Ya | Ya |
| Umum di | Web, Linux, JSON | Windows, Java, JS | Pemrosesan internal |
Bug Encoding
Bug encoding yang paling umum adalah memperlakukan byte sebagai karakter. Ketika Anda mengambil string UTF-8 dan menafsirkannya sebagai Latin-1 (ISO 8859-1), karakter beraksen muncul sebagai simbol yang kacau. Ini terjadi ketika encoding tidak dideklarasikan atau ketika alat mengasumsikan encoding yang salah.
Masalah umum lainnya adalah menghitung byte alih-alih karakter. Dalam UTF-8, string "café" adalah 4 karakter tetapi 5 byte karena é menggunakan dua byte. Fungsi seperti strlen di PHP menghitung byte secara default, sementara mb_strlen menghitung karakter.
Contoh Pemrograman
// PHP - selalu gunakan fungsi mb_* untuk UTF-8
$text = 'café ☕';
echo strlen($text); // 8 byte (salah)
echo mb_strlen($text, 'UTF-8'); // 6 karakter
// Encode/decode code points Unicode
echo mb_convert_encoding($text, 'UTF-16', 'UTF-8');
# Python 3 - string adalah Unicode secara default
text = 'café ☕'
print(len(text)) # 6 karakter
bytes_utf8 = text.encode('utf-8')
bytes_utf16 = text.encode('utf-16')
print(bytes_utf8) # b'caf\xc3\xa9 \xe2\x98\x95'
// JavaScript - string adalah UTF-16 secara internal
let text = 'café ☕';
console.log(text.length); // 6 (tetapi emoji mungkin dihitung sebagai 2)
// Encode sebagai byte UTF-8
let encoder = new TextEncoder();
let bytes = encoder.encode(text);
console.log(bytes); // Uint8Array(8)
Alat Online
Alat Unicode Encoder & Decoder di Help2Code mengonversi teks ke code points Unicode dan antara representasi UTF-8, UTF-16, dan UTF-32. Ini berguna untuk men-debug masalah encoding dan mempelajari cara kerja Unicode.
Kesimpulan
Encoding Unicode adalah pengetahuan penting bagi setiap pengembang yang bekerja dengan teks internasional. UTF-8 adalah standar untuk web dan harus menjadi default Anda. Memahami perbedaan antara code points dan representasi byte akan membantu Anda menghindari bug encoding teks yang paling umum. Gunakan Unicode Encoder & Decoder untuk bereksperimen dengan encoding dan men-debug masalah encoding.