Apa dasar untuk Unicode dan mengapa kebutuhan untuk UTF-8 atau UTF-16? Saya telah meneliti ini di Google dan mencari di sini juga tetapi tidak jelas bagi saya.
Dalam VSS ketika melakukan perbandingan file, kadang-kadang ada pesan yang mengatakan bahwa kedua file memiliki UTF yang berbeda. Mengapa demikian?
Tolong jelaskan secara sederhana.
Jawaban:
Mengapa kita perlu Unicode?
Pada hari-hari awal (tidak terlalu), semua yang ada adalah ASCII. Ini baik-baik saja, karena yang diperlukan hanyalah beberapa karakter kontrol, tanda baca, angka dan huruf seperti yang ada di kalimat ini. Sayangnya, dunia yang aneh saat ini dari komunikasi global dan media sosial tidak diramalkan, dan tidak terlalu aneh untuk melihat bahasa Inggris, العربية, 汉语, עִבְרִית, ελληνικά, dan ភាសាខ្មែរ dalam dokumen yang sama (saya harap saya tidak merusak yang lama) browser).
Tetapi demi argumen, katakanlah Joe Average adalah pengembang perangkat lunak. Dia bersikeras bahwa dia hanya akan membutuhkan bahasa Inggris, dan karena itu hanya ingin menggunakan ASCII. Ini mungkin baik untuk Joe pengguna , tetapi ini tidak baik untuk Joe pengembang perangkat lunak . Kira-kira separuh dunia menggunakan karakter non-Latin dan menggunakan ASCII bisa dibilang tidak mempertimbangkan orang-orang ini, dan di atas itu, ia menutup perangkat lunaknya ke ekonomi yang besar dan terus berkembang.
Oleh karena itu, diperlukan set karakter yang mencakup termasuk semua bahasa. Demikianlah datang Unicode. Ini memberikan setiap karakter nomor unik yang disebut titik kode . Satu keuntungan dari Unicode dibanding set lain yang mungkin adalah bahwa 256 titik kode pertama identik dengan ISO-8859-1 , dan karenanya juga ASCII. Selain itu, sebagian besar karakter yang umum digunakan hanya dapat diwakili oleh dua byte, di wilayah yang disebut Basic Multilingual Plane (BMP) . Sekarang diperlukan pengkodean karakter untuk mengakses rangkaian karakter ini, dan ketika pertanyaan diajukan, saya akan berkonsentrasi pada UTF-8 dan UTF-16.
Pertimbangan memori
Jadi berapa banyak byte yang memberikan akses ke karakter apa dalam pengkodean ini?
Perlu disebutkan sekarang bahwa karakter yang tidak ada dalam BMP termasuk skrip kuno, simbol matematika, simbol musik, dan karakter Cina / Jepang / Korea (CJK) yang lebih jarang .
Jika Anda sebagian besar akan bekerja dengan karakter ASCII, maka UTF-8 tentu saja lebih hemat memori. Namun, jika Anda bekerja sebagian besar dengan skrip non-Eropa, menggunakan UTF-8 bisa mencapai 1,5 kali lebih efisien memori daripada UTF-16. Saat berurusan dengan sejumlah besar teks, seperti halaman web yang besar atau dokumen kata yang panjang, ini dapat memengaruhi kinerja.
Dasar-dasar penyandian
Catatan: Jika Anda tahu bagaimana UTF-8 dan UTF-16 dikodekan, lewati ke bagian selanjutnya untuk aplikasi praktis.
1
untuk menghindari bentrok dengan karakter ASCII.Seperti dapat dilihat, UTF-8 dan UTF-16 sama sekali tidak kompatibel satu sama lain. Jadi jika Anda melakukan I / O, pastikan Anda tahu pengkodean mana yang Anda gunakan! Untuk detail lebih lanjut tentang penyandian ini, silakan lihat FAQ UTF .
Pertimbangan pemrograman praktis
Jenis data karakter dan string: Bagaimana mereka dikodekan dalam bahasa pemrograman? Jika mereka adalah byte mentah, saat Anda mencoba untuk mengeluarkan karakter non-ASCII, Anda mungkin mengalami beberapa masalah. Juga, bahkan jika jenis karakter didasarkan pada UTF, itu tidak berarti string UTF yang tepat. Mereka dapat mengizinkan urutan byte yang ilegal. Secara umum, Anda harus menggunakan pustaka yang mendukung UTF, seperti ICU untuk C, C ++ dan Java. Bagaimanapun, jika Anda ingin memasukkan / mengeluarkan sesuatu selain dari penyandian default, Anda harus mengubahnya terlebih dahulu.
Pengkodean yang disarankan / standar / dominan: Ketika diberi pilihan UTF mana yang akan digunakan, biasanya yang terbaik adalah mengikuti standar yang direkomendasikan untuk lingkungan tempat Anda bekerja. Misalnya, UTF-8 dominan di web, dan sejak HTML5, itu telah direkomendasikan sebagai pengkodean . Sebaliknya, lingkungan .NET dan Java didasarkan pada tipe karakter UTF-16. Membingungkan (dan salah), referensi sering dibuat ke "Unicode encoding", yang biasanya merujuk pada pengkodean UTF dominan di lingkungan tertentu.
Dukungan perpustakaan: Perpustakaan yang Anda gunakan mendukung semacam pengkodean. Yang mana? Apakah mereka mendukung kasus sudut? Karena kebutuhan adalah induk dari penemuan, perpustakaan UTF-8 umumnya akan mendukung karakter 4-byte dengan benar, karena 1, 2, dan bahkan 3 byte karakter dapat sering terjadi. Namun, tidak semua perpustakaan UTF-16 yang diakui mendukung pasangan pengganti dengan benar karena jarang terjadi.
Menghitung karakter: Ada menggabungkan karakter di Unicode. Misalnya titik kode U + 006E (n), dan U + 0303 (gabungan tilde) membentuk ñ, tetapi titik kode U + 00F1 membentuk ñ. Mereka harus terlihat identik, tetapi algoritma penghitungan sederhana akan mengembalikan 2 untuk contoh pertama, 1 untuk yang terakhir. Ini tidak selalu salah, tetapi mungkin juga bukan hasil yang diinginkan.
Membandingkan kesetaraan: A, А, dan Α terlihat sama, tetapi masing-masing berbahasa Latin, Sirilik, dan Yunani. Anda juga memiliki kasus seperti C dan Ⅽ, satu adalah surat, yang lain angka Romawi. Selain itu, kami memiliki karakter penggabungan yang perlu dipertimbangkan juga. Untuk info lebih lanjut lihat Karakter duplikat di Unicode .
Pasangan pengganti: Ini cukup sering muncul di SO, jadi saya hanya akan memberikan beberapa contoh tautan:
Lainnya ?:
sumber
sumber
Karena sumber daya yang kredibel selalu dibutuhkan, tetapi laporan resmi sangat besar, saya sarankan membaca yang berikut:
Penjelasan singkat:
Komputer membaca byte dan orang membaca karakter, jadi kami menggunakan standar pengodean untuk memetakan karakter ke byte. ASCII adalah standar pertama yang banyak digunakan, tetapi hanya mencakup bahasa Latin (7 bit / karakter dapat mewakili 128 karakter berbeda). Unicode adalah standar dengan tujuan untuk mencakup semua karakter yang mungkin ada di dunia (dapat menampung hingga 1.114.112 karakter, artinya 21 bit / karakter maks. Saat ini Unicode 8.0 menentukan 120.737 karakter secara total, dan hanya itu).
Perbedaan utama adalah bahwa karakter ASCII dapat masuk ke byte (8 bit), tetapi sebagian besar karakter Unicode tidak bisa. Jadi bentuk / skema pengkodean (seperti UTF-8 dan UTF-16) digunakan, dan model karakter seperti ini:
Setiap karakter memegang posisi yang disebutkan dari 0 hingga 1.114.111 (hex: 0-10FFFF) yang disebut titik kode .
Sebuah bentuk pengkodean peta titik kode untuk urutan kode unit. Sebuah kode unit adalah cara yang Anda inginkan karakter yang akan diselenggarakan di memori, unit 8-bit, unit 16-bit dan seterusnya. UTF-8 menggunakan 1 hingga 4 unit 8 bit, dan UTF-16 menggunakan 1 atau 2 unit 16 bit, untuk mencakup seluruh Unicode maksimal 21 bit. Unit menggunakan awalan sehingga batas karakter dapat terlihat, dan lebih banyak unit berarti lebih banyak awalan yang menempati bit. Jadi, meskipun UTF-8 menggunakan 1 byte untuk skrip Latin, ia membutuhkan 3 byte untuk skrip yang lebih baru di dalam Basic Multilingual Plane, sementara UTF-16 menggunakan 2 byte untuk semua ini. Dan itulah perbedaan utama mereka.
Terakhir, skema pengkodean (seperti UTF-16BE atau UTF-16LE) memetakan (menserialisasi) urutan unit kode ke urutan byte.
karakter: π
titik kode: U + 03C0
bentuk penyandian (unit kode):
UTF-8: CF 80
UTF-16:
skema penyandian (bytes)
UTF-8: UTF-8: CF 80
UTF-16BE: 03 C0
UTF-16LE: C0 03
Kiat: digit hex mewakili 4 bit, jadi angka hex dua digit mewakili byte. Lihat
juga peta Plane di Wikipedia untuk merasakan tata letak set karakter.
sumber
Awalnya, Unicode dimaksudkan untuk memiliki pengodean 16-bit dengan lebar tetap (UCS-2). Pengadopsi awal Unicode, seperti Java dan Windows NT, membangun pustaka mereka dengan string 16-bit.
Kemudian, ruang lingkup Unicode diperluas untuk memasukkan karakter historis, yang akan membutuhkan lebih dari 65.536 poin kode yang didukung oleh penyandian 16-bit. Untuk memungkinkan karakter tambahan untuk diwakili pada platform yang telah menggunakan UCS-2, pengkodean UTF-16 diperkenalkan. Ini menggunakan "pasangan pengganti" untuk mewakili karakter di pesawat tambahan.
Sementara itu, banyak perangkat lunak dan protokol jaringan yang lebih lama menggunakan string 8-bit. UTF-8 dibuat sehingga sistem ini dapat mendukung Unicode tanpa harus menggunakan karakter lebar. Ini kompatibel dengan mundur dengan 7-bit ASCII.
sumber
Artikel ini menjelaskan semua detail http://kunststube.net/encoding/
MENULIS UNTUK BUFFER
jika Anda menulis ke buffer 4 byte, simbol
あ
dengan pengkodean UTF8, biner Anda akan terlihat seperti ini:00000000 11100011 10000001 10000010
jika Anda menulis ke buffer 4 byte, simbol
あ
dengan pengkodean UTF16, biner Anda akan terlihat seperti ini:00000000 00000000 00110000 01000010
Seperti yang Anda lihat, tergantung pada bahasa apa yang akan Anda gunakan dalam konten Anda ini akan mempengaruhi memori Anda sesuai.
misalnya untuk simbol khusus ini:
あ
Pengkodean UTF16 lebih efisien karena kami memiliki 2 byte cadangan untuk digunakan untuk simbol berikutnya. Tetapi itu tidak berarti bahwa Anda harus menggunakan UTF16 untuk alfabet Jepang.BACAAN DARI BUFFER
Sekarang jika Anda ingin membaca byte di atas, Anda harus tahu dalam pengkodean apa itu ditulis dan decode kembali dengan benar.
mis. Jika Anda mendekode ini: 00000000 11100011 10000001 10000010 ke dalam pengkodean UTF16, Anda akan berakhir dengan
臣
tidakあ
Catatan: Pengkodean dan Unicode adalah dua hal yang berbeda. Unicode adalah besar (tabel) dengan setiap simbol dipetakan ke titik kode unik. misalnya
あ
simbol (huruf) memiliki (titik kode) : 30 42 (hex). Pengkodean di sisi lain, adalah algoritma yang mengubah simbol ke cara yang lebih tepat, ketika menyimpan ke perangkat keras.sumber
Unicode adalah standar yang memetakan karakter dalam semua bahasa ke nilai numerik tertentu yang disebut Poin Poin . Alasan dilakukannya ini adalah karena memungkinkan penyandian yang berbeda dimungkinkan menggunakan set poin kode yang sama.
UTF-8 dan UTF-16 adalah dua penyandian seperti itu. Mereka mengambil titik kode sebagai input dan mengkodekannya menggunakan beberapa rumus yang didefinisikan dengan baik untuk menghasilkan string yang dikodekan.
Memilih penyandian tertentu tergantung pada kebutuhan Anda. Pengkodean yang berbeda memiliki persyaratan memori yang berbeda dan tergantung pada karakter yang akan Anda hadapi, Anda harus memilih pengodean yang menggunakan urutan byte terkecil untuk mengkodekan karakter tersebut.
Untuk detail lebih lanjut tentang Unicode, UTF-8 dan UTF-16, Anda dapat melihat artikel ini,
Apa yang harus diketahui setiap programmer tentang Unicode
sumber
Kenapa unicode? Karena ASCII hanya memiliki 127 karakter. Mereka yang 128-125 berbeda di negara yang berbeda, itu sebabnya ada codepages. Jadi mereka berkata mari kita memiliki hingga 1114111 karakter. Jadi bagaimana Anda menyimpan codepoint tertinggi? Anda harus menyimpannya menggunakan 21 bit, jadi Anda akan menggunakan DWORD yang memiliki 32 bit dengan 11 bit terbuang. Jadi, jika Anda menggunakan DWORD untuk menyimpan karakter unicode, itu adalah cara termudah karena nilai dalam DWORD Anda cocok persis dengan codepoint. Tetapi array DWORD tentu saja lebih besar dari array WORD dan tentu saja bahkan lebih besar dari array BYTE. Itu sebabnya tidak hanya utf-32, tetapi juga utf-16. Tetapi utf-16 berarti stream WORD, dan WORD memiliki 16 bit jadi bagaimana codepoint 1114111 tertinggi dapat masuk ke dalam WORD? Itu tidak bisa! Jadi mereka menempatkan segala sesuatu yang lebih tinggi dari 65535 ke dalam DWORD yang mereka sebut pasangan pengganti. Pasangan pengganti tersebut adalah dua KATA dan dapat dideteksi dengan melihat 6 bit pertama. Jadi bagaimana dengan utf-8? Ini adalah byte array atau byte stream, tetapi bagaimana codepoint 1114111 tertinggi dapat masuk ke dalam byte? Itu tidak bisa! Oke, jadi mereka memasukkan juga DWORD kan? Atau mungkin KATA, kan? Hampir benar! Mereka menemukan urutan utf-8 yang berarti bahwa setiap codepoint yang lebih tinggi dari 127 harus dikodekan ke dalam urutan 2-byte, 3-byte atau 4-byte. Wow! Tetapi bagaimana kita bisa mendeteksi urutan seperti itu? Nah, semuanya hingga 127 adalah ASCII dan satu byte. Apa yang dimulai dengan 110 adalah urutan dua byte, apa yang dimulai dengan 1110 adalah urutan tiga byte dan apa yang dimulai dengan 11110 adalah urutan empat byte. Bit yang tersisa dari apa yang disebut "startbytes" ini milik codepoint. Sekarang tergantung pada urutannya, byte berikut harus mengikuti. Byte berikut dimulai dengan 10, bit yang tersisa adalah 6 bit bit payload dan milik codepoint. Menggabungkan bit payload dari startbyte dan byte / s berikut dan Anda akan memiliki codepoint. Itu semua keajaiban utf-8.
sumber
ASCII - Perangkat lunak hanya mengalokasikan 8 byte dalam memori untuk karakter yang diberikan. Ini bekerja dengan baik untuk karakter Inggris & adopsi (kata pinjaman seperti façade) karena nilai desimalnya berada di bawah 128 dalam nilai desimal. Contoh program C.
UTF-8 - Perangkat Lunak mengalokasikan 1 hingga 4 variabel 8 bit byte untuk karakter yang diberikan. Apa yang dimaksud dengan variabel di sini? Katakanlah Anda mengirim karakter 'A' melalui halaman HTML Anda di browser (HTML adalah UTF-8), nilai desimal yang sesuai dari A adalah 65, ketika Anda mengubahnya menjadi desimal menjadi 01000010. Ini hanya membutuhkan 1 byte , Memori 1 byte dialokasikan bahkan untuk karakter bahasa Inggris yang diadopsi khusus seperti 'ç' dalam façade kata. Namun, ketika Anda ingin menyimpan karakter Eropa, itu membutuhkan 2 byte, jadi Anda perlu UTF-8. Namun, saat Anda menggunakan karakter Asia, Anda memerlukan minimal 2 byte dan maksimum 4 byte. Demikian pula, Emoji memerlukan 3 hingga 4 byte. UTF-8 akan menyelesaikan semua kebutuhan Anda.
UTF-16 akan mengalokasikan minimum 2 byte dan maksimum 4 byte per karakter, itu tidak akan mengalokasikan 1 atau 3 byte. Setiap karakter direpresentasikan dalam 16 bit atau 32 bit.
Lalu mengapa ada UTF-16? Awalnya, Unicode adalah 16 bit bukan 8 bit. Java mengadopsi versi asli UTF-16.
Singkatnya, Anda tidak perlu UTF-16 di mana pun kecuali itu sudah diadopsi oleh bahasa atau platform yang sedang Anda kerjakan.
Program Java yang dipanggil oleh browser web menggunakan UTF-16 tetapi browser web mengirim karakter menggunakan UTF-8.
sumber
UTF adalah kependekan dari Unicode Transformation Format. Pada dasarnya di dunia sekarang ini ada skrip yang ditulis dalam ratusan bahasa lain, format yang tidak tercakup oleh ASCII dasar yang digunakan sebelumnya. Oleh karena itu, UTF muncul.
UTF-8 memiliki kemampuan pengkodean karakter dan unit kode-nya adalah 8 bit sedangkan untuk UTF-16 adalah 16 bit.
sumber