Saya telah mendengar pendapat yang bertentangan dari orang-orang - menurut halaman Wikipedia UTF-8 .
Mereka adalah hal yang sama, bukan? Bisakah seseorang mengklarifikasi?
Saya telah mendengar pendapat yang bertentangan dari orang-orang - menurut halaman Wikipedia UTF-8 .
Mereka adalah hal yang sama, bukan? Bisakah seseorang mengklarifikasi?
Jawaban:
Untuk memperluas jawaban yang diberikan orang lain:
Kami memiliki banyak bahasa dengan banyak karakter yang sebaiknya ditampilkan oleh komputer. Unicode memberikan setiap karakter nomor unik, atau titik kode.
Komputer berurusan dengan angka-angka seperti byte ... melewatkan sedikit sejarah di sini dan mengabaikan masalah pengalamatan memori, komputer 8-bit akan memperlakukan byte 8-bit sebagai unit numerik terbesar yang dengan mudah diwakili pada perangkat keras, komputer 16-bit akan berkembang itu untuk dua byte, dan sebagainya.
Pengkodean karakter lama seperti ASCII berasal dari era (pra) 8-bit, dan mencoba menjejalkan bahasa dominan dalam komputasi pada saat itu, yaitu bahasa Inggris, ke dalam angka mulai dari 0 hingga 127 (7 bit). Dengan 26 huruf dalam alfabet, baik dalam bentuk kapital dan non-kapital, angka dan tanda baca, yang bekerja dengan cukup baik. ASCII diperluas oleh bit ke-8 untuk bahasa lain, bukan bahasa Inggris, tetapi 128 angka / poin kode tambahan yang disediakan oleh ekspansi ini akan dipetakan ke karakter yang berbeda tergantung pada bahasa yang ditampilkan. Standar ISO-8859 adalah bentuk paling umum dari pemetaan ini; ISO-8859-1 dan ISO-8859-15 (juga dikenal sebagai ISO-Latin-1, latin1, dan ya ada dua versi berbeda dari standar ISO 8859 juga).
Tapi itu tidak cukup ketika Anda ingin mewakili karakter dari lebih dari satu bahasa, jadi menjejalkan semua karakter yang tersedia ke dalam satu byte tidak akan berfungsi.
Pada dasarnya ada dua jenis pengkodean: satu memperluas rentang nilai dengan menambahkan lebih banyak bit. Contoh pengkodean ini adalah UCS2 (2 byte = 16 bit) dan UCS4 (4 byte = 32 bit). Mereka secara inheren menderita masalah yang sama dengan standar ASCII dan ISO-8859, karena kisaran nilainya masih terbatas, bahkan jika batasnya jauh lebih tinggi.
Jenis pengkodean lainnya menggunakan jumlah variabel byte per karakter, dan pengkodean yang paling umum dikenal untuk ini adalah pengkodean UTF. Semua pengkodean UTF bekerja dengan cara yang kurang lebih sama: Anda memilih ukuran satuan, yang untuk UTF-8 adalah 8 bit, untuk UTF-16 adalah 16 bit, dan untuk UTF-32 adalah 32 bit. Standar kemudian mendefinisikan beberapa bit ini sebagai flag: jika mereka ditetapkan, maka unit berikutnya dalam urutan unit harus dianggap bagian dari karakter yang sama. Jika tidak disetel, unit ini sepenuhnya mewakili satu karakter. Dengan demikian karakter (bahasa Inggris) yang paling umum hanya menempati satu byte di UTF-8 (dua di UTF-16, 4 di UTF-32), tetapi karakter bahasa lainnya dapat menempati enam byte atau lebih.
Pengkodean multi-byte (saya harus mengatakan multi-unit setelah penjelasan di atas) memiliki keuntungan bahwa mereka relatif hemat-ruang, tetapi kelemahan yang operasi seperti menemukan substring, perbandingan, dll. Semua harus mendekode karakter ke kode unicode poin sebelum operasi tersebut dapat dilakukan (ada beberapa cara pintas, meskipun).
Baik standar UCS dan standar UTF menyandikan poin kode seperti yang didefinisikan dalam Unicode. Secara teori, pengkodean tersebut dapat digunakan untuk menyandikan angka apa pun (dalam kisaran yang didukung pengkodean) - tetapi tentu saja pengkodean ini dibuat untuk menyandikan titik kode Unicode. Dan itulah hubungan Anda di antara mereka.
Windows menangani apa yang disebut string "Unicode" sebagai string UTF-16, sementara sebagian besar UNIX default ke UTF-8 hari ini. Protokol komunikasi seperti HTTP cenderung berfungsi paling baik dengan UTF-8, karena ukuran unit di UTF-8 sama dengan ASCII, dan sebagian besar protokol tersebut dirancang pada era ASCII. Di sisi lain, UTF-16 memberikan kinerja ruang / pemrosesan rata-rata terbaik saat mewakili semua bahasa yang hidup.
Standar Unicode mendefinisikan lebih sedikit poin kode daripada yang dapat direpresentasikan dalam 32 bit. Jadi untuk semua tujuan praktis, UTF-32 dan UCS4 menjadi penyandian yang sama, karena Anda tidak mungkin harus berurusan dengan karakter multi-unit di UTF-32.
Harapan yang mengisi beberapa detail.
0x04000000
ke 0x7FFFFFFF
, atau dalam biner itu 1111110v 10vvvvvv 10vvvvvv 10vvvvvv 10vvvvvv 10vvvvvv
- dan itu memang 6 byte. Namun, 6 byte adalah maksimum , dan bukan sebagai artikel yang membingungkan mengklaim "enam byte atau lebih ".
Biarkan saya menggunakan contoh untuk menggambarkan topik ini:
A chinese character: 汉
it's unicode value: U+6C49
convert 6C49 to binary: 01101100 01001001
Sejauh ini tidak ada yang ajaib, sangat sederhana. Sekarang, katakanlah kita memutuskan untuk menyimpan karakter ini di hard drive kita. Untuk melakukan itu, kita perlu menyimpan karakter dalam format biner. Kita cukup menyimpannya seperti '01101100 01001001'. Selesai!
Tapi tunggu dulu, apakah '01101100 01001001' satu karakter atau dua karakter? Anda tahu ini adalah satu karakter karena saya katakan, tetapi ketika komputer membacanya, ia tidak tahu. Jadi kita perlu semacam "penyandian" untuk memberitahu komputer untuk memperlakukannya sebagai satu.
Di sinilah aturan 'UTF-8' masuk: http://www.fileformat.info/info/unicode/utf8.htm
Binary format of bytes in sequence
1st Byte 2nd Byte 3rd Byte 4th Byte Number of Free Bits Maximum Expressible Unicode Value
0xxxxxxx 7 007F hex (127)
110xxxxx 10xxxxxx (5+6)=11 07FF hex (2047)
1110xxxx 10xxxxxx 10xxxxxx (4+6+6)=16 FFFF hex (65535)
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx (3+6+6+6)=21 10FFFF hex (1,114,111)
Menurut tabel di atas, jika kita ingin menyimpan karakter ini menggunakan format 'UTF-8', kita perlu mengawali karakter kita dengan beberapa 'header'. Karakter Cina kami berukuran 16 bit (hitung sendiri nilai binernya), jadi kami akan menggunakan format pada baris 3 karena menyediakan ruang yang cukup:
Header Place holder Fill in our Binary Result
1110 xxxx 0110 11100110
10 xxxxxx 110001 10110001
10 xxxxxx 001001 10001001
Menuliskan hasilnya dalam satu baris:
11100110 10110001 10001001
Ini adalah nilai UTF-8 (biner) dari karakter Cina! (konfirmasikan sendiri: http://www.fileformat.info/info/unicode/char/6c49/index.htm )
A chinese character: 汉
it's unicode value: U+6C49
convert 6C49 to binary: 01101100 01001001
embed 6C49 as UTF-8: 11100110 10110001 10001001
PS Jika Anda ingin mempelajari topik ini dengan python, klik di sini
0
maka karakter diwakili oleh 1 gigitan (yang sekarang), jika byte dimulai dengan 110
maka karakter diwakili oleh 2 byte (saat ini dan yang berikutnya ( bit tersisa setelah 10
)), jika byte dimulai dengan 1110
maka karakter diwakili oleh 3 byte, arus dan 2 byte berikutnya (bit tersisa setelah 10
).
"Unicode" sayangnya digunakan dalam berbagai cara, tergantung pada konteksnya. Penggunaannya yang paling benar (IMO) adalah sebagai set karakter berkode - yaitu serangkaian karakter dan pemetaan antara karakter dan titik kode integer yang mewakili mereka.
UTF-8 adalah pengkodean karakter - cara mengkonversi dari urutan byte ke urutan karakter dan sebaliknya. Ini mencakup seluruh rangkaian karakter Unicode. ASCII dikodekan sebagai satu byte per karakter, dan karakter lain mengambil lebih banyak byte tergantung pada titik kode yang tepat (hingga 4 byte untuk semua titik kode yang saat ini didefinisikan, yaitu hingga U-0010FFFF, dan memang 4 byte dapat mengatasi hingga U-001FFFFF).
Ketika "Unicode" digunakan sebagai nama pengkodean karakter (misalnya sebagai .NET Encoding.Unicode properti) biasanya berarti UTF-16 , yang mengkodekan karakter paling umum sebagai dua byte. Beberapa platform (terutama. NET dan Java) menggunakan UTF-16 sebagai pengkodean karakter "asli" mereka. Hal ini menyebabkan masalah besar jika Anda perlu khawatir tentang karakter yang tidak dapat dikodekan dalam nilai UTF-16 tunggal (mereka dikodekan sebagai "pasangan pengganti") - tetapi sebagian besar pengembang tidak pernah khawatir tentang hal ini, IME.
Beberapa referensi tentang Unicode:
Mereka bukan hal yang sama - UTF-8 adalah cara pengkodean Unicode tertentu.
Ada banyak penyandian berbeda yang dapat Anda pilih tergantung pada aplikasi Anda dan data yang ingin Anda gunakan. Yang paling umum adalah UTF-8, UTF-16 dan UTF-32 sejauh yang saya tahu.
Unicode hanya menentukan titik kode , yaitu angka yang mewakili karakter. Cara Anda menyimpan titik-titik kode ini dalam memori tergantung pada penyandian yang Anda gunakan. UTF-8 adalah salah satu cara pengkodean karakter Unicode, di antara banyak lainnya.
Unicode adalah standar yang mendefinisikan, bersama dengan ISO / IEC 10646, Universal Character Set (UCS) yang merupakan superset dari semua karakter yang ada yang diperlukan untuk mewakili hampir semua bahasa yang dikenal.
Unicode menetapkan Nama dan Nomor ( Kode Karakter , atau Kode-Poin ) untuk setiap karakter dalam repertoarnya.
Pengkodean UTF-8 , adalah cara untuk mewakili karakter-karakter ini secara digital dalam memori komputer. UTF-8 memetakan setiap titik kode ke dalam urutan oktet (byte 8-bit)
Untuk misalnya,
UCS Character = Unicode Han Character
Kode-titik UCS = U + 24B62
Pengkodean UTF-8 = F0 A4 AD A2 (hex) = 11110000 10100100 10101101 10100010 (bin)
http://www.wikiwand.com/en/UTF-8#/Description
Lihatlah baris pertama.
Unicode hanyalah standar yang mendefinisikan seperangkat karakter ( UCS ) dan penyandian ( UTF ) untuk menyandikan rangkaian karakter ini. Tetapi secara umum, Unicode mengacu pada set karakter dan bukan standar.
Baca Mutlak Minimum Setiap Pengembang Perangkat Lunak Sepenuhnya, Positif Harus Tahu Tentang Unicode dan Set Karakter (Tanpa Alasan!) Dan Unicode Dalam 5 Menit .
Jawaban yang ada sudah menjelaskan banyak detail, tetapi inilah jawaban yang sangat singkat dengan penjelasan dan contoh paling langsung.
Unicode adalah standar yang memetakan karakter ke codepoint.
Setiap karakter memiliki titik kode unik (nomor identifikasi), yang merupakan angka seperti 9731.
UTF-8 adalah yang encoding dari codepoints.
Untuk menyimpan semua karakter pada disk (dalam file), UTF-8 membagi karakter menjadi hingga 4 oktet (urutan 8-bit) - byte. UTF-8 adalah salah satu dari beberapa pengkodean (metode mewakili data). Sebagai contoh, dalam Unicode, (decimal) codepoint 9731 mewakili manusia salju ( ☃
), yang terdiri dari 3 byte di UTF-8:E2 98 83
Ada banyak karakter di seluruh dunia, seperti "$, &, h, a, t,?, 张, 1, =, + ...".
Lalu datanglah sebuah organisasi yang didedikasikan untuk karakter ini,
Mereka membuat standar yang disebut "Unicode".
Standarnya adalah sebagai berikut:
PS: Tentu saja ada organisasi lain bernama ISO yang mempertahankan standar lain - "ISO 10646", hampir sama.
Seperti di atas, U + 0024 hanyalah sebuah posisi, jadi kami tidak dapat menyimpan "U + 0024" di komputer untuk karakter "$".
Harus ada metode pengkodean.
Kemudian datang metode pengkodean, seperti UTF-8, UTF-16, UTF-32, UCS-2 ....
Di bawah UTF-8, titik kode "U + 0024" dikodekan ke 00100100.
00100100 adalah nilai yang kami simpan di komputer untuk "$".
Saya telah memeriksa tautan dalam jawaban Gumbo, dan saya ingin menempelkan sebagian dari hal-hal itu di sini untuk ada di Stack Overflow juga.
"... Beberapa orang di bawah kesalahpahaman bahwa Unicode hanyalah kode 16-bit di mana setiap karakter mengambil 16 bit dan oleh karena itu ada 65.536 karakter yang mungkin. Ini bukan, sebenarnya, benar. Ini adalah satu-satunya mitos paling umum tentang Unicode , jadi jika Anda berpikir begitu, jangan merasa buruk.
Faktanya, Unicode memiliki cara berpikir yang berbeda tentang karakter, dan Anda harus memahami cara berpikir Unicode tentang sesuatu atau tidak ada yang masuk akal.
Hingga saat ini, kami mengasumsikan bahwa surat memetakan beberapa bit yang dapat Anda simpan di disk atau di memori:
A -> 0100 0001
Dalam Unicode, surat memetakan sesuatu yang disebut titik kode yang masih hanya konsep teoretis. Bagaimana titik kode itu direpresentasikan dalam memori atau pada disk adalah cerita lain ... "
"... Setiap huruf platonis dalam setiap alfabet diberi nomor ajaib oleh konsorsium Unicode yang ditulis seperti ini: U + 0639. Angka ajaib ini disebut titik kode. U + berarti" Unicode "dan jumlahnya adalah heksadesimal. U + 0639 adalah huruf Arab Ain. Huruf bahasa Inggris A akan menjadi U + 0041 .... "
"... Oke, jadi katakan kita punya string:
Halo
yang, dalam Unicode, sesuai dengan lima poin kode ini:
U + 0048 U + 0065 U + 006C U + 006C U + 006F.
Hanya sekelompok poin kode. Bilangan, sungguh. Kami belum mengatakan apa pun tentang cara menyimpan ini di memori atau mewakilinya dalam pesan email ... "
"... Di situlah penyandian masuk.
Ide awal untuk pengkodean Unicode, yang mengarah pada mitos tentang dua byte, adalah, hei, mari kita simpan angka-angka itu dalam dua byte masing-masing. Jadi Halo menjadi
00 48 00 65 00 6C 00 6C 00 6F
Baik? Tidak secepat itu! Tidak mungkin juga:
48 00 65 00 6C 00 6C 00 6F 00? ... "
UTF-8 adalah salah satu skema penyandian yang memungkinkan untuk teks Unicode .
Unicode adalah standar luas yang menetapkan lebih dari 130.000 karakter dan mengalokasikan masing-masing kode numerik (titik kode). Itu juga mendefinisikan aturan untuk bagaimana mengurutkan teks ini, menormalkannya, mengubah kasusnya, dan banyak lagi. Karakter dalam Unicode diwakili oleh titik kode dari nol hingga 0x10FFFF inklusif, meskipun beberapa titik kode dicadangkan dan tidak dapat digunakan untuk karakter.
Ada lebih dari satu cara bahwa serangkaian titik kode Unicode dapat dikodekan ke dalam aliran biner. Ini disebut "penyandian". Pengkodean yang paling mudah adalah UTF-32 , yang hanya menyimpan setiap titik kode sebagai integer 32-bit, dengan lebar masing-masing 4 byte.
UTF-8 adalah pengkodean lain, dan menjadi standar de-facto, karena sejumlah keunggulan dibandingkan UTF-32 dan lainnya. UTF-8 mengkodekan sebagai urutan nilai byte tunggal. Setiap titik kode dapat menggunakan nomor variabel dari nilai byte ini. Poin kode dalam rentang ASCII dikodekan telanjang, agar kompatibel dengan ASCII. Poin kode di luar rentang ini menggunakan jumlah variabel byte, baik 2, 3, atau 4, tergantung pada kisaran mereka.
UTF-8 telah dirancang dengan mempertimbangkan sifat-sifat ini:
Karakter ASCII dikodekan persis seperti di ASCII, sehingga string ASCII juga merupakan string UTF-8 yang valid.
Penyortiran Biner: Menyortir string UTF-8 menggunakan semacam biner naif masih akan menghasilkan semua poin kode yang diurutkan dalam urutan numerik.
Karakter yang membutuhkan beberapa byte tidak mengandung nilai byte apa pun dalam rentang ASCII, memastikan sebagian dari mereka tidak dapat dikira sebagai karakter ASCII. Ini juga fitur keamanan.
UTF-8 dapat dengan mudah divalidasi, dan dibedakan dari pengkodean karakter lain oleh validator. Teks dalam pengkodean 8-bit atau multi-byte lainnya akan sangat jarang juga divalidasi sebagai UTF-8.
Akses acak: Pada titik mana pun dalam string UTF-8, dimungkinkan untuk mengetahui apakah byte pada posisi itu adalah byte pertama dari karakter atau tidak, dan untuk menemukan awal karakter berikutnya atau saat ini, tanpa perlu memindai ke depan atau mundur lebih dari beberapa byte atau membaca apa pun di awal aliran.
Mereka adalah hal yang sama, bukan?
Tidak, mereka tidak.
Saya pikir kalimat pertama dari halaman Wikipedia yang Anda referensikan memberikan ringkasan yang bagus dan singkat:
UTF-8 adalah pengkodean karakter lebar variabel yang mampu mengkodekan semua 1.112.064 poin kode yang valid dalam Unicode menggunakan satu hingga empat byte 8-bit.
Untuk menguraikan:
Unicode adalah standar, yang mendefinisikan peta dari karakter ke angka, yang disebut titik kode , (seperti pada contoh di bawah). Untuk pemetaan penuh, Anda bisa melihatnya di sini .
! -> U+0021 (21),
" -> U+0022 (22),
\# -> U+0023 (23)
UTF-8 adalah salah satu cara untuk menyandikan titik-titik kode ini dalam bentuk yang dapat dipahami komputer, alias bit . Dengan kata lain, ini adalah cara / algoritme untuk mengubah setiap titik kode tersebut menjadi urutan bit atau mengubah urutan bit ke titik kode yang setara. Perhatikan bahwa ada banyak penyandian alternatif untuk Unicode.
Joel memberikan penjelasan yang sangat bagus dan ikhtisar sejarah di sini .
Jika saya dapat meringkas apa yang saya kumpulkan dari utas ini:
Unicode 'menerjemahkan' karakter ke angka urut (dalam bentuk desimal) .
à = 224
UTF-8 adalah pengkodean yang 'menerjemahkan' angka-angka ini ke representasi biner .
224 = 11000011 10100000
Perhatikan bahwa kita berbicara tentang representasi biner dari 224, bukan bentuk binernya, yaitu 0b11100000.
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.
30 42 (hex) - > UTF8 encoding - > E3 81 82 (hex), which is above result in binary.
30 42 (hex) - > UTF16 encoding - > 30 42 (hex), which is above result in binary.