Memahami Character Set dan Character Encoding

Banyak dari kita pasti sering  mendengar istilah character set dan character encoding, jika kita sering berkecimpung dengan dunia pemrograman, kedua istilah ini harus kita pahami dengan  baik, karena merupakan masalah yang mendasar terutama jika berhubungan dengan pengelolaan data seperti penggunaan database.

Untuk itu pada  artikel singkat ini kita akan coba membahas sedikit lebih dalam mengenai character set dan character encoding, karena cakupannya sangat luas, dalam artikel pendek ini akan dibahas beberapa saja yang sering digunakan terutama pada website.

Daftar Isi:

  1. Apa itu character set, Sistem Encoding, dan Sistem Decoding?
  2. Character Set ASCII
  3. Character Set Latin1
  4. Unicode (character set terakhir?)
  5. Character Set UTF-16 dan  UCS-2
  6. Character Set UTF-32 atau UCS-4
  7. Character Set dan Character Encoding Utf-8
  8. Ambiguitas Character Set dan Caharacter Encoding
  9. Jadi Character Set mana yang sebaiknya digunakan?

1. Apa itu character set, Sistem Encoding, dan Sistem Decoding?

Character set adalah sekumpulan karakter yang biasanya berupa angka, huruf dan berbagai karakter lain yang terstandarisasi, yang masing-masing memiliki ID unik yang disebut code point.

Karakter yang ditampung  pada suatu character set  tergantung pada jenis character set itu sendiri.

Saat ini banyak sekali character set, mungkin jumlahnya mencapai ratusan,  beberapa berstandar internasional yang dikembangkan International Organization for Standardization (ISO), beberapa standar negara tertentu dan beberapa lainnya dikembangkan secara spesifik  oleh vendor komputer untuk tujuan maupun konsumen tertentu.

Contoh beberapa  character set yang umum digunakan: ASCII (US), UTF-16, UTF-8,  Microsoft Code Page 1252 (Vendor Windows),  GB18030 (China), Shift-JIS (Jepang)

Sistem Encoding

Encoding adalah suatu proses  untuk mengubah karakter yang ada pada suatu character set menjadi nilai yang dimengerti oleh oleh komputer, nilai tersebut biasanya berbentuk bit (0 dan 1).

Sistem encoding berbeda-beda tergantung dari standar yang digunakan, masing masing standar memiliki teknik tersendiri untuk menterjemahkan karakter  ke bentuk binary.

Sistem Decoding

Kebalikan dari encoding, decoding adalah proses untuk mengubah digit binary ke bentuk karakter sehingga dapat  ditampilkan sesuai karakter aslinya. Namun terkait dengan character set, istilah decoding ini jarang kita dengar karena istilah encoding sudah cukup mewakili proses internal yang ada.

2. Character Set ASCII

Pada awal generasi digunakannya  sistem komputer, ASCII Character Set yang mulai  ada sejak 1960-an menjadi standar yang digunakan di sebagian besar  sistem komputer untuk menampilkan karakter.

ASCII merupakan kependekan dari  American Standard Code for Information Interchange, sehingga dapat ditebak bahwa ASCII ini dibuat oleh Amerika, yang memang ditujukan untuk mengakomodasi karakter yang digunakan pada bahasa mereka  dan oleh sebab itu ASCII generasi pertama ini sering disebut US-ASCII.

Character Set ASCII hanya terdiri dari 128 karakter yang terdiri dari karakter  nyata (huruf, angka,  simbol dan tanda baca) dan karakter  tidak nyata (tab, enter, alt, dsb), contoh karakter ASCII adalah seperti yang ada pada tombol keyboard yang kita gunakan sekarang ini, untuk lebih lengkapnya  dapat  dilihat pada tabel ini.

Kenapa hanya 128 karakter? ya karena memang pada saat itu hanya karakter tersebut yang diperlukan dan sistem yang ada hanya dapat menampung sejumlah karakter terebut  dan  sampai dengan saat ini  saya rasa masih cukup memadahi.

Setiap karakter yang ada pada ASCII cukup ditampung kedalam 7 bit binary digit, sehingga dapat dikatakan ASCII menggunakan 7 bit sistem encoding, contoh:

Karakter Binary Karakter Binary
a 1100001 @ 1000000
b 1100010 # 0100011
c 1100011 % 0100101
1 0110001 ! 0100001
2 0110010 $ 0100100
3 0110011 & 0100110

meskipun  7 bit, ruang penyimpanan yang dibutuhkan tetap 1 byte (8 bit), sehingga pada skema sistem 8 bit, 7 bit pertama digunakan untuk menyimpan karakter ASCII sedangkan bit ke delapan bernilai 0, dari sini kemudian muncul pertanyaan bukankah 1 bit yang tersisa bisa digunakan untuk menyimpan karakter lain?

3. Character Set Latin-1 atau  ISO/IEC 8859-1

Semakin berkembangnya penggunaan komputer dan internet, maka negara-negara maju lain di Eropa khususnya  yang menggunakan karakter khusus seperti penggunaan accent (tanda diatas karakter) yang digunakan di negara  Jerman, Swedia, Prancis, Belanda, dll merasakan keterbatasan ASCII.

Hal tersebut karena dengan ASCII, mereka tidak dapat menggunakan karakter yang ada pada bahasa mereka, sehingga pertukaran data tidak dapat dilakukan dengan baik.

Permasalahan tersebut menjadi isu penting dan akhirnya pada tahun 1987  direlease versi pertama dari ISO-8859-1 atau Latin1 (beberapa ada yang menggunakan istilah  Extended ASCII, 8 bit ASCII atau ASCII – bukan US-ASCII) yang diadopsi dari ECMA Standard (European Computer Manufacturers Association).

Angka  1 pada ISO-8859-1 berarti standard  encoding pertama dari seri ISO-8859  yang terdaftar di ISO.

Karakter yang ada pada ISO-8859-1 hanya terdiri  dari karakter ASCII  ditambah  dengan beberapa karakter yang khusus digunakan di bahasa negara-negara Eropa Barat, penambahan ini dimulai dari karakter ke 128 s.d 255.

Kenapa 128 bukan 129? bukankah ASCII jumlah karakternya 128? ya betul, ASCII jumlah karakternya 128, namun urutan karakter dimulai dari 0, sehingga penghitungan karakter dimulai dari 0.

Karakter yang  ada pada  ISO-8859-1 dapat dilihat di  http://www.ascii-code.com/

Karakter pada Latin1 tetap berukuran 1 byte, karena seperti disebutkan sebelumnya bahwa masih terdapat 1 bit tersisa pada sistem encoding ASCII, penggunaan  1 bit ini berdampak bertambahnya  kombinasi bilangan biner sehingga dalam sistem 8 bit dapat diperoleh karakter berjumlah 256(2^8).

Penggunaan 1 byte ini disebut juga single byte encoding.  Berikut ini contoh karakter Latin1 dan nilai binary nya:

TEXT ASCII BINARY TEXT ASCII BINARY
ä chr(228) 11100100 ø chr(248) 11111000
å chr(229) 11100101 ù chr(249) 11111001
æ chr(230) 11100110 ú chr(250) 11111010
ç chr(231) 11100111 ý chr(253) 11111101
è chr(232) 11101000 þ chr(254) 11111110
é chr(233) 11101001 ÿ chr(255) 11111111

Pada tabel diatas terlihat bahwa setiap karakter terdiri dari 8 binary digit (1 byte). Untuk karakter lainnya dapat dilihat pada link berikut ini.

Munculnya Latin1 ini ternyata  belum dapat mengatasi keterbatasan penggunaan karakter, seperti penggunaan karakter di negara negara Eropa Tengah dan Timur, oleh karena itu  perlu dikembangkan character set lain yang dapat mengakomodasi karakter tersebut.

Mulailah bermunculanlah character set baru yang diberi nama  ISO-8859-2 atau Latin2, ISO-8859-3 atau Latin3, dan seterusnya  hingga  ISO-8859-16 yang direlease tahun 2001. Masing masing character set spesifik untuk bahasa  tertentu dan tujuan tertentu. Untuk detail seri ISO 8859 dapat dibaca di  wikipedia.

Secara umum format character set ISO-8859-x adalah karakter ke 0 s.d 127 untuk  karakter ASCII sedangkan sisanya karakter  tambahan. contoh:

Encoding #0 – #127 #128 – #255
ISO-8859-5 ASCII Cyrillic
ISO-8859-6 ASCII Arabic
ISO-8859-7 ASCII Greek
ISO-8859-8 ASCII Hebrew

4. Unicode (character set terakhir?)

Seperti pembahasan diatas, ternyata terdapat  banyak sekali character set, masing masing dikembangkan hanya untuk  penggunaan pada regional tertentu, dan untuk tujuan tertentu, tidak ada character set yang dapat menampung semua karakter yang digunakan oleh  semua bahasa.

Hal ini terjadi karena sistem encoding yang dikembangkan masih menggunakan sistem single byte (8 bit) dimana hanya dapat menampung karakter sebanyak  256.

Untuk mengatasi hal tersebut, perlu dikembangkan suatu character set yang dapat menampung sekaligus banyak karakter, tidak hanya 256, jika perlu dapat menampung semua karakter yang digunakan oleh semua  bahasa di dunia ini, dan yang pasti tidak mungkin bisa menggunakan sistem single byte encoding.

Dilatarbelakangi hal tersebut muncullah Unicode Character Set yang dikembangkan oleh Unicode Consortium.

Saat ini Unicode dapat mengcover lebih dari 1.100.000 karakter, angka tersebut sangat cukup untuk mengakomodasi semua karakter yang digunakan semua bahasa di dunia ini.

Dari waktu kewaktu, karakter baru terus ditambahkan, tidak hanya bahasa resmi negara tetapi juga bahasa daerah termasuk aksara jawa, Bali Bugis, Sunda, dll

Sampai dengan saat ini (Unicode Versi 8.o – di release  17 Juni 2015) jumlah karakter yang ditambahkan  baru sebanyak 120.737, sehingga  baru terpakai sekitar 12% dari kapasitas yang ada, masih sisa tersisa 88% yang masih  sangat cukup untuk penggunaan  jangka panjang.

Dengan perkembangan yang ada dapat dikatakan  bahwa unicode characterset  is the last character set. Waktu yang akan membuktikannya.

5. Character Set UTF-16 dan  UCS-2

Pada awal generasi Unicode Standard (versi 1.0.0), diperkenalkan  character set yang mampu menampung karakter lebih dari 256, saat itu digunakan sistem fixed  width encoding dengan basis  16 bit (2 x 8 bit) atau disebut  dengan istilah double byte encoding.

Sistem encoding ini sama  dengan yang digunakan pada UCS-2 (2-byte Universal Character Set) – didefinisikan oleh ISO 10646, yang sudah terlebih dahulu diperkenalkan.

Pada generasi awal unicode ini belum dikenal istilah UTF-16 karena memang hanya satu sistem encoding yang digunakan.

Dengan basis  16 bit, karakter yang ditampung mencapai  65.536 karakter (216), sistem tersebut berlangsung hingga Unicode versi 1.1.0 (1991 s.d 1995).

Semakin lama sistem encoding yang ada  tidak cukup menampung karakter baru yang belum ditambahkan, oleh karena itu diperkenalkanlah  UTF-16 atau disebut juga Extended UCS-2 yang direlease  tahun 1996.

UTF-16 merupakan sistem  variable length  encoding  yang berarti setiap code point  (kode yang mencerminkan suatu karakter) di encode menggunakan satu atau dua kali 16-bit (1 code unit = 16 bit).

Sederhananya setiap karakter unicode di encode  menjadi 16 bit (1 code unit) atau 32 bit (2 code unit) tergantung jenis karakternya.

16 bit pertama digunakan untuk mengencode karakter yang ada pada Basic Multilanguage Plane BMP (karakter ke 0 s.d 65.535), sedangkan 16 bit berikutnya digunakan untuk mengencode karakter  tambahan.

BPM sudah mencakup sangat banyak karakter dan simbol, mulai dari bahasa yang umum hingga yang rumit seperti  CJK (China, Jepang, Korea), disamping itu  juga sudah menampung aksara daerah dari berbagai negara, seperti yang ada di kita: aksara Jawa (Unicode versi 5.2), Bali, Sunda dan Batak, selengkapnya dapat dilihat di  link ini.

Perbedaan karakter yang dapat diencode oleh UTF-16 dan UCS-2 tampak seperti pada tabel berikut:

Encoding #0 – #65535 > 65.535
UTF-16 BPM Karakter Lain
UCS-2 BPM

Keuntungan penggunaan UTF-16 adalah karakter pada BMP diencode  menggunakan  sistem fixed length  16bit, sehingga mudah untuk diindex (mendukung byte order dependent), tidak seperti pada utf8 yang menggunakan 8 s.d 24 bit.

Meski demikian, karakter yang semestinya bisa diencode menggunakan sistem 8 bit, harus diencode menggunakan sistem 16 bit, seperti pada karakter ASCII, yang artinya yang seharusnya bisa disimpan menggunakan ruang 1 byte dipaksa menggunakan 2 byte, sehingga UTF-16 ini cocok digunakan pada aplikasi yang mementingkan speed dan tidak mempermasalahkan  ruang penyimpanan.

Kelemahan lain adalah sama sekali tidak mendukung karakter ASCII, karena jelas sistem encoding yang digunakan berbeda, sehingga karakter yang disimpan dengan sistem encoding ASCII tidak dapat dibuka oleh aplikasi yang menggunakan sistem encoding UTF-16.

Saat ini UTF-16 masih populer digunakan, diantaranya: bahasa pemrograman Java, C#, Objective C dan Windows API

6. Character Set UTF-32 atau UCS-4

UTF-32 secara resmi menjadi bagian dari Unicode standar pada versi 3.1.0 yang  dipublikasikan tahun 2001, sistem encoding ini sama dengan yang digunakan pada UCS-4 (4-byte Universal Character Set) – didefinisikan oleh ISO 10646, yang sudah terlebih dahulu diperkenalkan.

Angka 32 pada UTF berarti 32 bit dan 4 pada UCS berarti 4  byte, yang dapat diartikan bahwa space yang digunakan untuk menyimpan suatu karakter adalah 4 byte atau 32 bit.

UTF-32 merupakan alternatif dari UTF-16, jika pada UTF-16 terdapat penggunaan sistem doubel 16 bit (untuk karakter ke 65.535 keatas), UTF-32 menggunakan  fixed – width encoding, dengan base  32 bit (1 code unit = 32 bit), dimana  semua karakter  disimpan menggunakan sistem  32 bit encoding.

Akibatnya setiap karakter membutuhkan ruang penyimpanan sebesar 4 byte (32 bit), meskipun sebenarnya terdapat karakter yang hanya menggunakan 8 bit, sehingga pada  UTF-32, yang terisi hanya 8 bit pertama, sisanya bernilai 0.

Dengan model encoding seperti ini, binary dapat diindex/diurutkan (mendukung byte order dependent) – seperti pada ASCII, sehingga pencarian suatu  karakter dapat dilakukan lebih cepat.

Meski demikian encoding ini memiliki kelemahan yaitu memakan banyak space dan memory, yang  tentu saja tidak efisien, contoh kata halo pada UTF-32 membutuhkan ruang penyimpanan 16 byte, sedangkan pada ASCII cukup 4 byte.

Contoh karakter dan nilai binary nya pada UTF-32:

TEXT Chr Ke BINARY
! 32 00000000 00000000 00000000 00100001
Љ 1025 00000000 00000000 11111001 01100101
65.537 00000000 00000010 00100111 01001000

karena semua karakter diencode pada 32 bit maka karakter yang sering digunakan pun (karakter ke 0 s.d 65536) yang ada di BMP juga akan disimpan sebesar 4 byte yang tentu saja lebih efisien  menggunakan UTF-16 karena hanya membutuhkan ruang penyimpanan 2 byte. Oleh karena itu penggunaan UTF-32 saat ini sudah jarang ditemui.

7. Character Set dan Character Encoding Utf-8

Generasi terakhir dari sistem encoding UTF adalah UTF-8.  UTF-8 resmi masuk ke Unicode Standar pada versi 5.0.0 (2006). Sistem encoding  UTF-8 hingga saat ini  paling banyak  digunakan untuk pertukaran data, terutama pada media internet, yang hingga saat ini sudah mencapai angka  85.3% (27 Oktober 2015) dan akan terus meningkat.

UTF-8 menggunakan sistem  variable length  encoding dengan basis 8 bit (1 code unit = 8bit), angka ini  tercermin pada  angka 8 yang berada di belakang UTF.

Sistem  variable length  berarti karakter di encoding menggunakan pola tertentu dengan panjang bit tidak tetap tergantung jenis karakternya, bisa 8, 16, 24 atau 32 bit. Pembagian penggunaan bit adalah sebagai berikut:

  • 8 bit (1 byte) encoding digunakan untuk karakter 0 s.d 127, sama persis dengan yang digunakan ASCII.
  • 16 bit (2 byte) encoding digunakan untuk karakter 128 s.d 2047.  Contoh: Huruf Latin Extended (dengan tilde (Ã), macron ( ¯), acute(Á), grave(À) dan  accents (tanda diatas huruf) lainnya), huruf kirilitz (cyrillic) yang digunakan beberapa negara Slavia: Rusia, Ukraina, Bulgaria dan Serbia (Contoh:  ÃÅ¡ÃÂÃâ€ºÃËœÃÂ¤ÃÅ¾ÃÂ ÃÂÃËœÃÂ¯)  , Yunani (Greek), contoh:  ÃŽÂ¼ÃŽÂ±ÃŽÂ³ÃŽÂµÃŽÂ¹ÃŽÂ±, Armenia, Ibarani (Hebrew), contoh: הוא עובד, Arab contoh: اللغة العربية, dan lainnya.
  • 24 bit (3 byte) encoding digunakan untuk karakter 2048 s.d 65.535. Contoh huruf Cina, Jepang dan Korea.
  • 32 bit (4 byte) encoding untuk karakter 65.536 s.d  1,112,064

dari data diatas diketahui bahwa UTF-8 menggunakan 1 s.d 3 byte untuk mengencode karakter yang ada pada pada  BMP (0 s.d 65.535),  berbeda dengan UTF-16 yang hanya 2 byte, sedangkan  untuk karakter ASCII UTF-8 hanya butuh 1 byte, tidak seperti UTF-16 yang butuh 2 byte.

Pada UTF-8 sistem 1 byte encoding yang digunakan sama persis dengan sistem yang digunakan pada  ASCII sehingga UTF-8 kompatibel dengan karakter ASCII, yang artinya karakter yang disimpan menggunakan sistem encoding ASCII  dapat dibuka menggunakan sistem encoding UTF.

Perbandingan bit yang digunakan

Perbandingan bit yang digunakan pada  ketiga sistem encoding yang ada pada Unicode Standar tampak seperti pada tabel berikut:

Range  (Hexadecimal) Range  (Decimal) UTF-8 UTF-16 UTF-32
000000 – 00007F 0-127 1 2 4
000080 – 00009F 128-2.047 2
0000A0 – 0003FF
000400 – 0007FF
000800 – 003FFF 2.048-65.535 3
004000 – 00FFFF
010000 – 03FFFF 65.536-1.114.111 4 4
040000 – 10FFFF

8. Ambiguitas Character Set dan Caharacter Encoding

Dari uraian diatas secara jelas dapat kita bedakan  apa itu character set dan apa itu sistem encoding, namun kenyataannya terkadang  kedua istilah ini  membingungkan.

Pada awal  munculnya ASCII standard hingga ISO-8859-x istilah character set dan sistem encoding merujuk ke standar itu sendiri, misal istilah  ASCII Character Set digunakan untuk menyebut character set yang digunakan ASCII, dan ASCII encoding untuk menyebut sistem encoding pada ASCII.

Meskipun sebenarnya istilah ASCII lebih tepat digunakan untu character set, begitu juga dengan ISO-8958-1 atau Latin1 standar.

Pada awal muncul Unicode standar pun, istilah yang sama masih masih dapat digunakan, namun setelah muncul UTF-16, istilah character set dan sistem encoding mulai agak membingungkan

Banyak yang menyebut UTF sebagai character set dan Unicode adalah sistem encoding padahal sebenarnya  UTF  adalah sistem encoding dan Unicode lebih tepat digunakan untuk menyebut character set, walaupun Unicode sendiri hanya merupakan  suatu standar.

Contoh pada dokumen HTML sering  kita jumpai  meta tag berikut:

<meta Content-Type: text/html; charset=utf-8>

Dalam mengartikan tag diatas, mungkin beberapa orang  menganggap  bahwa charset="utf-8"  maksudnya adalah character set yang digunakan adalah UTF-8, padahal sebenarnya yang dimaksud disini adalah sistem encoding yang digunakan adalah UTF-8.

Hal yang sama juga terjadi pada istilah dalam dunia database, seperti MySQL yang menyebut utf8, utf16, utf32 dan utf8mb4 sebagai character set.

9. Jadi Character Set mana yang sebaiknya digunakan?

Berdasarkan uraian diatas, selanjutnya muncul pertanyaan, jadi sebaiknya character set mana yang sebaiknya digunakan? hal ini tergantung dari jenis karakter  yang akan kita digunakan, beberapa kemungkinan yang ada:

  • Aplikasi/website yang kita bangun menggunakan satu bahasa/beberapa berbahasa yang hanya menggunakan jenis huruf alphabet biasa (seperti  Bahasa Indonesia atau Bahasa Inggris), maka cukup menggunakan character set ASCII (ascii pada MysQL) atau ISO-8859-1 (Latin1 pada MySQL).

    Kenapa tidak utf8? bukankan utf8 juga menyimpannya sebesar 1 byte?

    Hal ini tergantung dari sistem penyimpanan yang kita gunakan, pada database tertentu seperti MySQL penggunaan utf8 memungkinkan penggunaan ruang penyimpanan lebih dari 1 byte tergantung tipe data yang digunakan, sedangkan Latin1, ASCII, dan sejenisnya  pasti menggunakan ruang 1 byte.

  • Bahasa yang kita gunakan menggunakan bahasa tertentu, misal  bahasa Arab, maka dapat menggunakan character set ISO-8859-6 yang memang di desain  untuk penggunaan arabic alphabet namun tidak termasuk character tambahan seperti yang digunakan pada alphabet bahasa Urdu dan Persia.

    Namun jika character mengandung character urdu seperti pada quran dan hadis, character set tersebut tidak  bisa digunakan lagi karena character yang digunakan lebih kompleks, seperti  (  Ã™â€žÃ˜Â§ÃšÂ¯Ã˜Â§, شيرِ), sehingga  pilihannya utf-16 atau utf-8.

    Pada utf-16 character ini di encode menggunakan sistem 2 byte dan 3 byte pada utf-8, sehingga lebih efisien menggunakan utf-16.

  • Aplikasi yang kita kembangkan ditujukan untuk pengguna seluruh dunia (world wide) sehingga mau tidak mau kita harus dapat menampung semua kemungkinan character yang ada.

    Untuk kondisi seperti ini mau tidak mau kita harus menggunakan utf-16 atau utf-8, namun lebih menguntungkan utf-8 karena untuk character alphabet disimpan hanya dalam 1 byte.

Kesimpulan

Character set merupakan sekumpulan karakter yang terstandardisasi.

Character set pertama adalah  ASCII yang diperkenalkan tahun 1960, sejak itu muncul berbagai character set yang semuanya  ditujukan untuk menampung karakter yang dibutuhkan namun terbatas hanya untuk regional tertentu dan tujuan tertentu.

Tahun 1991 mulai diperkenalkan Unicode Standar atau sering disebut Unicode Character Set  yang dapat menampung semua karakter yang ada baik yang sudah ada pada character set lain maupun yang belum terdefinisi,  dan hingga saat ini Unicode merupakan  satu standar yang paling banyak digunakan terutama untuk pertukaran data di internet

Demikian pembahasan character set dan character encoding, semoga bermanfaat.

Subscibe Now

Suka dengan artikel di Jagowebdev.com? jangan sampai ketinggalan, segera join ke milis kami untuk update informasi terbaru dari Jagowebdev.com

Komitmen Kami: Kami senantiasa menghargai privasi Anda dan tidak akan membagikan identitas Anda ke pihak manapun.

14 Feedback dari pembaca

Silakan tinggalkan komentar

Newsletter

Jadilah yang pertama tahu berita terbaru dari Jagowebdev.com