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:
- Apa itu character set, Sistem Encoding, dan Sistem Decoding?
- Character Set ASCII
- Character Set Latin1
- Unicode (character set terakhir?)
- Character Set UTF-16 dan UCS-2
- Character Set UTF-32 atau UCS-4
- Character Set dan Character Encoding Utf-8
- Ambiguitas Character Set dan Caharacter Encoding
- 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
14 Feedback dari pembaca
thanks infonya gan
Sama-sama mas
artikel yang sangat membantu thank’s min
Sama sama mas…
Pencerahan nya sangat gamblang, thanks admin..
Terima kasih, sama sama mas..
ijin nanya gan
File “main.py”, line 3
SyntaxError: Non-UTF-8 code starting with ‘\xff’ in file main.py on line 3, but
no encoding declared;
solusinya gan ?
Itu sedang load file atau bagaimana mas? Sepertinya karakternya tidak dikenali
Mohon bantuannya, kenapa waktu saya decode teks hasilnyna selalu ada tambahan serperti ini di kata paling depan ùòè??$£ atau ùòè??$$ padahal kata selanjutnya itu normal semua sesuai dengan yg di encode
Mungkin source text nya mas…
Makasih bapak/ibu
Mungkin dari sini salah nya saya ngirim email ngga sampe sampe ke HRD hehehe
Sama sama mas…
Terima kasih atas pencerahannya. Sangat jelas dan padat
Terima kasih mas