Saya agak bingung tentang penyandian. Sejauh yang saya tahu karakter ASCII lama mengambil satu byte per karakter. Berapa byte yang diperlukan oleh karakter Unicode?
Saya berasumsi bahwa satu karakter Unicode dapat berisi setiap karakter yang mungkin dari bahasa apa pun - apakah saya benar? Jadi berapa byte yang dibutuhkan per karakter?
Dan apa artinya UTF-7, UTF-6, UTF-16 dll. Apakah mereka versi Unicode yang berbeda?
Saya membaca artikel Wikipedia tentang Unicode tetapi cukup sulit bagi saya. Saya menantikan jawaban sederhana.
Jawaban:
Anda tidak akan melihat jawaban sederhana karena tidak ada jawaban.
Pertama, Unicode tidak mengandung "setiap karakter dari setiap bahasa", meskipun itu pasti mencoba.
Unicode itu sendiri adalah pemetaan, mendefinisikan codepoints dan codepoint adalah angka, biasanya dikaitkan dengan karakter. Saya katakan biasanya karena ada konsep seperti menggabungkan karakter. Anda mungkin terbiasa dengan hal-hal seperti aksen, atau umlaut. Itu dapat digunakan dengan karakter lain, seperti a
a
atau au
untuk membuat karakter logis baru. Karenanya karakter dapat terdiri dari 1 atau lebih codepoint.Agar bermanfaat dalam sistem komputasi, kita perlu memilih representasi untuk informasi ini. Itu adalah berbagai pengkodean unicode, seperti utf-8, utf-16le, utf-32 dll. Mereka dibedakan sebagian besar oleh ukuran unit kode mereka. UTF-32 adalah pengkodean yang paling sederhana, ia memiliki kode unit yaitu 32 bit, yang berarti suatu titik kode individu cocok dengan nyaman ke dalam kode unit. Pengkodean lainnya akan memiliki situasi di mana codepoint akan membutuhkan beberapa kode unit, atau bahwa codepoint tertentu tidak dapat diwakili dalam pengkodean sama sekali (ini adalah masalah misalnya dengan UCS-2).
Karena fleksibilitas menggabungkan karakter, bahkan dalam pengkodean yang diberikan jumlah byte per karakter dapat bervariasi tergantung pada karakter dan bentuk normalisasi. Ini adalah protokol untuk berurusan dengan karakter yang memiliki lebih dari satu representasi (Anda dapat mengatakan
"an 'a' with an accent"
yang merupakan 2 codepoint, salah satunya adalah char yang menggabungkan atau"accented 'a'"
yang merupakan satu codepoint).sumber
Anehnya, tidak ada yang menunjukkan bagaimana cara menghitung berapa byte yang mengambil satu karakter Unicode. Berikut adalah aturan untuk string yang dikodekan UTF-8:
Jadi jawaban cepatnya adalah: dibutuhkan 1 hingga 4 byte, tergantung pada yang pertama yang akan menunjukkan berapa banyak byte yang dibutuhkan.
sumber
Saya tahu pertanyaan ini sudah lama dan sudah memiliki jawaban yang diterima, tetapi saya ingin menawarkan beberapa contoh (berharap itu akan bermanfaat bagi seseorang).
Baik. Sebenarnya, karena ASCII adalah enkode 7-bit, ia mendukung 128 kode (95 di antaranya dapat dicetak), sehingga hanya menggunakan setengah byte (jika itu masuk akal).
Unicode hanya memetakan karakter ke codepoint. Itu tidak menentukan cara menyandikannya. File teks tidak mengandung karakter Unicode, tetapi byte / oktet yang mungkin mewakili karakter Unicode.
Tidak. Tapi hampir. Jadi pada dasarnya ya. Tapi tetap tidak.
Sama seperti pertanyaan kedua Anda.
Tidak, itu adalah pengkodean. Mereka menentukan bagaimana byte / oktet harus mewakili karakter Unicode.
Beberapa contoh. Jika beberapa di antaranya tidak dapat ditampilkan di browser Anda (mungkin karena font tidak mendukungnya), buka
http://codepoints.net/U+1F6AA
(ganti1F6AA
dengan codepoint in hex) untuk melihat gambar.a
©
®
ጷ
—
‰
€
™
☃
☎
☔
☺
⚑
⚛
✈
✞
〠
肉
💩
🚀
Oke saya terbawa ...
Fakta menyenangkan:
sumber
00A9
daripada00 A9
(yang akan menjadi UTF-16BE).Sederhananya
Unicode
adalah standar yang menetapkan satu nomor (disebut titik kode) untuk semua karakter di dunia (Masih bekerja dalam proses).Sekarang Anda harus mewakili poin kode ini menggunakan byte, itu disebut
character encoding
.UTF-8, UTF-16, UTF-6
adalah cara untuk mewakili karakter tersebut.UTF-8
adalah pengkodean karakter multibyte. Karakter dapat memiliki 1 hingga 6 byte (beberapa di antaranya mungkin tidak diperlukan saat ini).UTF-32
setiap karakter memiliki 4 byte a karakter.UTF-16
menggunakan 16 bit untuk setiap karakter dan itu hanya mewakili sebagian dari karakter Unicode yang disebut BMP (untuk semua keperluan praktis itu cukup). Java menggunakan pengkodean ini dalam string-nya.sumber
Di UTF-8:
Dalam UTF-16:
Di UTF-32:
10FFFF adalah codepoint unicode terakhir menurut definisi, dan didefinisikan demikian karena itu adalah batas teknis UTF-16.
Ini juga merupakan codepoint terbesar UTF-8 yang dapat mengkodekan dalam 4 byte, tetapi ide di balik pengkodean UTF-8 juga bekerja untuk pengkodean 5 dan 6 byte untuk mencakup codepoint sampai 7FFFFFFF, yaitu. setengah dari apa yang bisa UTF-32.
sumber
Di Unicode jawabannya tidak mudah diberikan. Masalahnya, seperti yang sudah Anda tunjukkan, adalah pengkodeannya.
Diberikan kalimat bahasa Inggris apa pun tanpa karakter diakritik, jawaban untuk UTF-8 akan sebanyak byte sebagai karakter dan untuk UTF-16 adalah jumlah karakter dikali dua.
Satu-satunya penyandian di mana (sampai sekarang) kita dapat membuat pernyataan tentang ukurannya adalah UTF-32. Selalu ada 32bit per karakter, meskipun saya membayangkan bahwa poin kode disiapkan untuk UTF-64 masa depan :)
Yang menyulitkan adalah setidaknya dua hal:
U+20AC
dapat direpresentasikan baik sebagai tiga byte urutanE2 82 AC
atau empat byte urutanF0 82 82 AC
.sumber
Ada alat yang hebat untuk menghitung byte dari string apa pun di UTF-8: http://mothereff.in/byte-counter
Pembaruan: @mathias telah membuat kode menjadi publik: https://github.com/mathiasbynens/mothereff.in/blob/master/byte-counter/eff.js
sumber
Yah saya baru saja menarik halaman Wikipedia juga, dan di bagian intro saya melihat "Unicode dapat diimplementasikan dengan pengkodean karakter yang berbeda. Pengkodean yang paling umum digunakan adalah UTF-8 (yang menggunakan satu byte untuk setiap karakter ASCII, yang memiliki nilai kode yang sama dalam pengkodean UTF-8 dan ASCII, dan hingga empat byte untuk karakter lain), UCS-2 yang sekarang usang (yang menggunakan dua byte untuk setiap karakter tetapi tidak dapat menyandikan setiap karakter dalam standar Unicode saat ini) "
Seperti yang ditunjukkan oleh kutipan ini, masalah Anda adalah Anda mengasumsikan Unicode adalah satu-satunya cara penyandian karakter. Sebenarnya ada beberapa bentuk Unicode, dan, sekali lagi dalam kutipan itu, salah satunya bahkan memiliki 1 byte per karakter seperti apa yang Anda gunakan.
Jadi jawaban sederhana yang Anda inginkan adalah bervariasi.
sumber
Untuk UTF-16, karakter membutuhkan empat byte (dua unit kode) jika dimulai dengan 0xD800 atau lebih besar; karakter seperti itu disebut "pasangan pengganti." Lebih khusus, pasangan pengganti memiliki bentuk:
di mana [...] menunjukkan unit kode dua byte dengan rentang yang diberikan. Apa pun <= 0xD7FF adalah satu unit kode (dua byte). Apa pun> = 0xE000 tidak valid (kecuali penanda BOM, bisa dibilang).
Lihat http://unicodebook.readthedocs.io/unicode_encodings.html , bagian 7.5.
sumber
Lihat konverter kode Unicode ini . Misalnya, masukkan
0x2009
, di mana 2009 adalah nomor Unicode untuk ruang tipis , di bidang "0x ... notasi", dan klik Konversi. Angka heksadesimalE2 80 89
(3 byte) muncul di bidang "unit kode UTF-8".sumber
Dari Wiki:
Ini adalah tiga pengkodean berbeda yang paling populer.
sumber
Unicode
adalah standar yang menyediakan angka unik untuk setiap karakter. Angka-angka unik ini disebutcode point
s (yang hanya kode unik) untuk semua karakter yang ada di dunia (beberapa masih akan ditambahkan).Untuk tujuan yang berbeda, Anda mungkin perlu merepresentasikan ini
code points
dalam byte (kebanyakan bahasa pemrograman melakukannya), dan di sinilahCharacter Encoding
tendangan masuk.UTF-8
,UTF-16
,UTF-32
Dan sebagainya semuaCharacter Encodings
, dan poin kode Unicode terwakili dalam pengkodean ini, dengan cara yang berbeda.UTF-8
pengkodean memiliki panjang lebar variabel, dan karakter, yang dikodekan di dalamnya, dapat menempati 1 hingga 4 byte inklusif;UTF-16
memiliki panjang variabel dan karakter, yang dikodekan di dalamnya, dapat mengambil 1 atau 2 byte (yaitu 8 atau 16 bit). Ini hanya mewakili sebagian dari semua karakter Unicode yang disebut BMP (Basic Multilingual Plane) dan itu sudah cukup untuk hampir semua kasus. Java menggunakanUTF-16
pengodean untuk string dan karakternya;UTF-32
memiliki panjang tetap dan masing-masing karakter membutuhkan tepat 4 byte (32 bit).sumber