Apa perbedaan antara UTF-8 dan Unicode?

504

Saya telah mendengar pendapat yang bertentangan dari orang-orang - menurut halaman Wikipedia UTF-8 .

Mereka adalah hal yang sama, bukan? Bisakah seseorang mengklarifikasi?

pembuatan sampul
sumber
1
Apa yang ditulis WIKI ini tentang unicode dan UTF tidak apa-apa menurut saya. Beberapa komentar tentangnya aneh: "Dimungkinkan dalam UTF-8 (atau pengkodean multi-byte lainnya) untuk membagi atau memotong string di tengah karakter, yang dapat mengakibatkan string yang tidak valid." Jadi string yang mendapatkan UTF-8 dikodekan tidak lebih dari string tetapi byte array atau byte stream. Karakter yang membentuk string disandikan. Tentu saja itu bisa diterjemahkan juga. Sekarang tentu saja Anda dapat memotong urutan utf-8 setelah byte awal atau setelah byte berikutnya tetapi mengapa seseorang harus melakukan ini?
brighty
Artikel tentang tipe data string ini bersifat mendidik: mortoray.com/2013/11/27/the-string-type-is-broken - kadang-kadang ketika bekerja dengan string dan komponen level byte-nya, Anda dapat secara tidak sengaja memotong karakter menjadi dua. .
Everett

Jawaban:

496

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.

Scott Tesler
sumber
9
Secara konseptual, UCS-2 dan UCS-4 adalah set karakter , bukan pengkodean karakter (karena itu namanya).
Siput mekanik
74
@ Tuukka Kesalahan dalam posting ini sangat banyak. Ada lebih dari hanya 2 versi ISO 8859. ASCII tidak berfungsi untuk bahasa Inggris, kehilangan hal-hal seperti kutipan keriting, tanda cent, aksen, & lebih banyak lagi — Unicode bukan hanya tentang non-Inggris; Bahasa Inggris juga membutuhkannya !! Tidak ada codepoint yang menempati lebih dari 4 byte dalam pengkodean APAPUN ; bisnis 6-byte ini benar-benar salah. Anda tidak dapat menyandikan-UTF nilai skalar Unicode apa pun karena ini mengatakan: pengganti & 66 karakter non-karakter semuanya dilarang. UCS-4 dan UTF-32 tidak sama. Tidak ada multi-unit UTF-32. UTF-16 tidak seefisien berpura-pura - & c & c & c!
tchrist
1
ASCII juga tidak mengandung tanda pound £, dan tentu saja tidak mengandung tanda euro € (yang jauh lebih muda dari ASCII).
TRiG
1
@tchrist Sepertinya 6 byte sama sekali tidak mustahil. Lihat ini: joelonsoftware.com/articles/Unicode.html yang menunjukkan bahwa ada ruang karakter dari 0x04000000ke 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 ".
syntaxerror
12
@syntaxerror: "Hanya titik kode 128 dan di atas yang disimpan menggunakan 2, 3, pada kenyataannya, hingga 6 byte." akurat ketika ditulis, tetapi kemudian pada tahun yang sama (dua belas tahun yang lalu) itu tidak valid. en.wikipedia.org/wiki/UTF-8 mengatakan "Spesifikasi asli mencakup angka hingga 31 bit (batas asli dari Universal Character Set). Pada November 2003, UTF-8 dibatasi oleh RFC 3629 untuk berakhir pada U + 10FFFF, agar sesuai dengan batasan dari pengkodean karakter UTF-16. Ini menghapus semua urutan 5 dan 6 byte, dan sekitar setengah dari urutan 4 byte. "
Mooing Duck
237

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 )

Ringkasan

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

Cheng
sumber
6
"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 beri tahu komputer untuk memperlakukannya sebagai satu. " Baiklah ok, tapi komputer masih tidak tahu harus mengkodekannya dengan utf-8?
Koray Tugay
15
@ KorayTugay Komputer tidak tahu pengkodean apa yang harus digunakan. Anda harus mengatakannya saat Anda menyimpan karakter ke file dan juga ketika Anda membaca karakter dari file.
Cheng
3
@Connor Komputer tidak tahu format apa yang digunakan. Saat Anda menyimpan dokumen, editor teks harus secara eksplisit mengatur penyandiannya menjadi utf-8 atau format apa pun yang ingin digunakan pengguna. Juga, ketika program editor teks membaca file, ia perlu memilih skema pengkodean teks untuk mendekodekannya dengan benar. Hal yang sama terjadi ketika Anda mengetik dan memasukkan huruf, editor teks perlu tahu skema apa yang Anda gunakan sehingga akan menyimpannya dengan benar.
Cheng
2
Jadi, bagaimana tajuk itu diinterpretasikan? jika saya melihat tabel pertama maka saya pikir: jika byte dimulai dengan bit 0maka karakter diwakili oleh 1 gigitan (yang sekarang), jika byte dimulai dengan 110maka karakter diwakili oleh 2 byte (saat ini dan yang berikutnya ( bit tersisa setelah 10)), jika byte dimulai dengan 1110maka karakter diwakili oleh 3 byte, arus dan 2 byte berikutnya (bit tersisa setelah 10).
JBoy
2
Baca 10 artikel tentang UTF-8; setelah membaca ini saya mengerti dalam 10 detik :)
jrhee17
201

"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:

Jon Skeet
sumber
16
Saya pikir UTF-16 hanya sama dengan "Unicode" pada platform Windows. Orang-orang cenderung menggunakan UTF-8 secara default di * nix. +1 sekalipun, jawaban yang bagus
jalf
10
@ Chris: Tidak, ISO-8859-1 bukan UTF-8. UTF-8 mengkodekan U + 0080 ke U + 00FF sebagai dua byte, bukan satu. Windows 1252 dan ISO-8859-1 sebagian besar sama, tetapi mereka berbeda antara nilai 0x80 dan 0x99 jika saya ingat dengan benar, di mana ISO 8859-1 memiliki "lubang" tetapi CP1252 mendefinisikan karakter.
Jon Skeet
13
Gagasan untuk memanggil UTF-16 "Unicode" duduk tidak nyaman dengan saya karena potensinya untuk membingungkan - meskipun ini jelas ditunjukkan hanya sebagai konvensi .NET. UTF-16 adalah cara untuk mewakili Unicode, tetapi itu bukan "The Unicode encoding".
thomasrutter
6
@unwesen: UTF-8 tidak perlu pasangan pengganti. Itu hanya mewakili karakter non-BMP menggunakan urutan byte semakin lama.
Jon Skeet
5
@RoyiNamir: Ya, "Unicode" sayangnya sering digunakan untuk berarti "UTF-16" khususnya di Windows.
Jon Skeet
108

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.

Greg
sumber
10
namun, intinya adalah bahwa beberapa editor mengusulkan untuk menyimpan file sebagai "Unicode" ATAU "UTF-8". Jadi penyebutan tentang "Unicode" dalam kasus itu adalah UTF-16 yang saya percaya perlu.
serhio
71

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.

Martin Cote
sumber
2
namun, intinya adalah bahwa beberapa editor mengusulkan untuk menyimpan file sebagai "Unicode" ATAU "UTF-8". Jadi penyebutan tentang "Unicode" dalam kasus itu adalah UTF-16 yang saya percaya perlu.
serhio
Sejumlah, yang menghadirkan karakter juga ASCII.
brighty
6
baca ini sebelum dan sesudah melihat sisa jawaban di halaman ini
Dodgie
33

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)

kereta malam
sumber
Tidak, UTF-8 memetakan hanya codepoint menjadi urutan yang lebih besar dari 127. Segala sesuatu dari 0 hingga 127 bukan urutan tetapi satu byte tunggal. Btw, ASCII juga memberikan Nama karakter ke sebuah angka, jadi ini sama dengan yang dilakukan Unicode. Tapi Unicode tidak berhenti di codepoint 127 tetapi naik ke 0x10ffff.
brighty
2
@secara terang saya berbeda. Karakter Ascii memang dipetakan ke urutan byte tunggal. Bit pertama, yaitu 0 dalam kasus kode untuk karakter ascii, menunjukkan berapa banyak byte yang mengikuti - nol. http://www.wikiwand.com/en/UTF-8#/DescriptionLihatlah baris pertama.
nightlytrails
Bagi saya urutan terdiri dari lebih dari satu byte. Karakter ASCII dalam UTF-8 adalah byte tunggal sebagaimana adanya, dengan bit yang paling signifikan diatur ke 0. Codepoint lebih tinggi dari 127 maka perlu urutan, yang selalu merupakan startbyte dan satu, dua atau tiga byte berikut. Jadi mengapa Anda menyebut byte tunggal sebagai "urutan"?
brighty
Yah ... Sering kali pengacara bahasa Inggris bisa dibuat bingung atas penyalahgunaan yang disengaja dalam perangkat lunak. Ini kasus yang sama di sini. Anda bisa membantahnya. Tapi itu tidak akan membuatnya lebih jelas.
nightlytrails
1
@ brighty Hmmm, Dalam matematika, urutan 0 elemen OK. Urutan 1 elemen juga baik-baik saja di sini.
chux - Reinstate Monica
24

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 .

Gumbo
sumber
1
@ Serhio: Saya tahu. Meskipun ada tiga pengkodean UTF-16 yang berbeda: Dua UTF-16LE dan UTF-16BE eksplisit dan UTF-16 implisit di mana endianness ditentukan dengan BOM.
Gumbo
@ Gumbo: Kurangnya BOM tidak berarti itu penyandian yang berbeda. Hanya ada dua penyandian.
Mooing Duck
Blog di atas ditulis oleh CEO Stakcoverflow.
Shailesh Pratapwar
23

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

Berikut daftar yang diurutkan dengan beberapa contoh acak .

basic6
sumber
1
Tidak! UTF-8 adalah cara yang bagus untuk menyandikan karakter unicode tetapi kita juga dapat menyandikannya dalam UTF-16 atau UTF-32. Dengan UTF-32 kami memiliki hubungan 1: 1 antara DWORD dan codepoint, dengan UTF-16 kami memiliki hubungan 1: 1 antara WORD dan codepoint hanya untuk codepoint dari BMP, tidak termasuk pengganti dan BOM. Dalam UTF-8 kita memiliki hubungan 1: 1 antara byte dan codepoint hanya untuk codepoint <
127.
5
@brighty: Benar, tapi mengapa "Tidak!"? Saya menulis "UTF-8 adalah salah satu dari beberapa pengkodean" karena ada juga UTF-16 dan UTF-32.
basic6
16

1. Unicode

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:

  • buat formulir di mana setiap posisi disebut "titik kode", atau "posisi kode".
  • Seluruh posisi dari U + 0000 hingga U + 10FFFF;
  • Hingga sekarang, beberapa posisi diisi dengan karakter, dan posisi lainnya disimpan atau kosong.
  • Misalnya, posisi "U + 0024" diisi dengan karakter "$".

PS: Tentu saja ada organisasi lain bernama ISO yang mempertahankan standar lain - "ISO 10646", hampir sama.

2. UTF-8

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 "$".

wengeezhang
sumber
1
Secara umum, UTF-8 adalah satu-satunya varian yang digunakan siapa pun saat ini.
Rick James
2
ISO 10646 adalah standar yang identik dengan set karakter Unicode. Unicode mendefinisikan banyak hal selain dari rangkaian karakter, seperti aturan untuk penyortiran, case, dll. ISO 10646 hanyalah kumpulan karakter (yang saat ini terdapat lebih dari 130.000). Unicode Consortium dan ISO mengembangkan Unicode bersama-sama, dengan ISO hanya memusatkan perhatian pada set karakter dan penyandiannya, dan Unicode juga mendefinisikan properti karakter dan aturan untuk memproses teks.
thomasrutter
12

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? ... "

kommradHomer
sumber
Di ASCII, surat juga memetakan ke codepoint, bukan hanya dalam unicode.
brighty
8

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.

thomasrutter
sumber
Beberapa poin minor: [1] Tidakkah seharusnya "karakter ASCII dikodekan persis seperti di ASCII " diubah menjadi "karakter ASCII dikodekan persis seperti di UTF-8 " ? [2] Frasa "Kode dalam Unicode ..." tidak jelas (bagi saya). Apakah maksud Anda "Poin kode Unicode ..." ?
skomisa
@skomisa untuk poin 1, maksud saya bahwa pengkodean karakter dalam rentang ASCII identik untuk ASCII dan untuk UTF-8.
thomasrutter
Untuk poin 2, itu poin yang adil dan saya akan mengeditnya agar lebih jelas
thomasrutter
2

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 .

Dimos
sumber
2

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.

remykarem
sumber
2

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.

masukkan deskripsi gambar di sini

InGeek
sumber
artikel tertaut sangat bagus, semoga terus aktif
yolob 21
0

UTF-8 adalah metode untuk pengkodean karakter Unicode menggunakan urutan 8-bit.

Unicode adalah standar untuk mewakili berbagai macam karakter dari banyak bahasa.

akaMahesh
sumber
4
"Urutan 8-bit" ...? Mungkin ingin menentukan lebih tepatnya ...
tipuan