Inspektur karakter Unicode
Menguraikan teks menjadi titik kodenya beserta nama, kategori, blok, dan pengodean, serta menandai karakter tak terlihat, bidi, dan mirip-rupa.
Apa yang dilakukan alat ini
Tempel teks apa pun dan ia kembali terurai menjadi karakter individual yang sebenarnya menyusunnya. Masing-masing mendapat nama Unicode-nya, nomor U+-nya, jenis karakter apa itu, sistem tulisan dan blok mana yang dimilikinya, bita yang ditempatinya dalam UTF-8 dan UTF-16, dan urutan escape yang dibutuhkannya dalam enam format berbeda.
Kebanyakan orang datang ke sini karena sesuatu tak masuk hitungan. Sebuah string lebih panjang dari tampaknya, dua nilai yang tampil identik menolak untuk dibandingkan sama, sebuah nama pengguna ditolak karena karakter yang tampak seperti huruf biasa, atau sebaris kode sumber terbaca berbeda dari cara ia berperilaku. Keempatnya punya bentuk yang sama: sebuah karakter melakukan sesuatu yang tak ditampilkan layar.
Karakter, titik kode, dan grafem
Kata "karakter" berarti setidaknya tiga hal berbeda, dan mencampuradukkannya adalah tempat kebanyakan kebingungan Unicode dimulai. Sebuah titik kode adalah satu nilai dalam standar Unicode, ditulis U+0041 atau U+1F600. Sebuah grafem adalah yang dihitung seorang pembaca sebagai satu karakter. Mereka sering bukan angka yang sama.
- Sebuah "a" polos adalah 1 grafem, 1 titik kode, 1 unit UTF-16 — semua sepakat.
- U+00E9, e-akut yang terkomposisi-awal, adalah 1 grafem, 1 titik kode, 1 unit UTF-16.
- U+0065 U+0301, huruf yang sama ditulis sebagai e plus sebuah aksen gabungan, adalah 1 grafem tetapi 2 titik kode dan 2 unit UTF-16.
- U+1F600, wajah menyeringai, adalah 1 grafem dan 1 titik kode tetapi 2 unit UTF-16 — ia tinggal di atas BMP, jadi JavaScript menyimpannya sebagai pasangan surogat.
- Emoji keluarga adalah 1 grafem, 5 titik kode, dan 8 unit UTF-16: tiga orang yang digabung oleh dua penggabung tak terlihat.
Emoji keluarga adalah kasus yang menjebak orang. Ia tampak seperti satu hal, JavaScript melaporkan panjangnya sebagai 8, dan sebuah kolom basis data 5 karakter tak akan menampungnya. Alat ini mengelompokkan titik kode di bawah grafem yang dibangunnya, jadi kedua pembacaan terlihat sekaligus alih-alih harus didamaikan di kepala Anda.
Karakter yang tak bisa Anda lihat
Sejumlah karakter Unicode yang mengejutkan tak menggambar apa pun sama sekali. Mereka ada untuk mengendalikan bagaimana teks di sekitarnya berperilaku, dan karena mereka tak meninggalkan bekas mereka bertahan penyalinan, penempelan, dan tinjauan tanpa ada yang menyadari. Ini adalah yang ditunjuk alat ketimbang sekadar didaftar:
- Spasi lebar-nol, penggabung, dan bukan-penggabung (U+200B, U+200D, U+200C) — tanpa lebar, tanpa bekas, dan mereka merusak setiap perbandingan string yang mereka sentuh.
- Tanda hubung lunak (U+00AD) — sebuah saran tentang di mana sebuah kata boleh patah, tak terlihat sampai ia patah.
- Spasi tak-pemutus (U+00A0) — tampak persis seperti sebuah spasi dan merupakan karakter berbeda, itulah sebabnya ia bertahan begitu lama dalam berkas konfigurasi.
- Tanda urutan bita (U+FEFF) — sering ditinggalkan di awal sebuah berkas, tempat ia menjadi karakter pertama tak terlihat dari nilai pertama.
- Kontrol dan penimpaan bidi (U+202A sampai U+202E, U+2066 sampai U+2069) — mereka menata ulang teks di sekitarnya.
Kontrol bidi layak disebut sendiri. Mereka ditambahkan agar aksara Ibrani dan Arab bisa dicampur dengan teks Latin dengan benar, dan mereka melakukan pekerjaan itu dengan baik. Tetapi sebuah penimpaan yang ditaruh di dalam sebuah komentar atau sebuah literal string bisa membuat sebaris kode sumber tampil dalam urutan yang sepenuhnya berbeda dari urutan yang dibaca kompilator — yang berarti seorang peninjau bisa menyetujui kode yang melakukan sesuatu yang sama sekali lain. Kelas trik itu dikenal sebagai Trojan Source, dan itu sebabnya alat ini menandai setiap kontrol bidi terpisah dari karakter tak terlihat lainnya.
Karakter mirip-rupa dan aksara campur
Unicode mengandung banyak karakter yang secara visual identik dengan huruf ASCII dan bukan mereka. Kiril а, Yunani ο, dan Latin a menempati titik kode berbeda dan tampil sama di kebanyakan font. Sebuah domain atau nama pengguna yang dibangun dari mereka tampak benar dan menunjuk ke tempat lain.
Menandai setiap mirip-rupa non-ASCII akan tak berguna: ia akan mengecat setiap kata Rusia, Yunani, atau Ibrani merah, dan sebuah peringatan yang memicu pada teks biasa adalah peringatan yang orang belajar melewati. Jadi aturan di sini adalah yang dipakai standar keamanan Unicode — sebuah kata mencurigakan ketika huruf di dalamnya datang dari lebih dari satu sistem tulisan:
- "paypal.com" ditulis seluruhnya dalam huruf Latin: tak ada yang perlu dikatakan tentangnya.
- Kata yang sama dengan er dan a Kiril di depan "ypal" Latin: satu kata, dua sistem tulisan, ditandai.
- Sebuah kata Rusia utuh dalam Kiril: satu sistem tulisan, teks biasa, tak ditandai.
- Sebuah kalimat Jepang memakai Han, Hiragana, dan Katakana bersama: tiga aksara, satu sistem tulisan, tak ditandai.
Kasus terakhir itu adalah alasan aturan butuh kehati-hatian. Jepang ditulis dengan tiga aksara sekaligus dan Korea mencampur dua, jadi sebuah uji naif "lebih dari satu aksara mencurigakan" akan menyebut setiap kalimat Jepang sebuah serangan. Kombinasi yang benar-benar satu sistem tulisan diperlakukan sebagai satu, yang menjaga peringatan tetap bermakna.
Normalisasi, atau mengapa dua string identik berbeda
Beberapa karakter bisa ditulis lebih dari satu cara. Huruf é entah titik kode tunggal U+00E9 atau pasangan U+0065 U+0301 — sebuah e polos diikuti sebuah aksen akut gabungan. Keduanya tampil identik. Tak satu pun salah. Mereka tak sama.
Normalisasi adalah proses memilih satu ejaan, dan ada empat bentuknya. NFC mengomposisi di mana pun ia bisa dan adalah yang diasumsikan web secara default; NFD mendekomposisi sebagai gantinya. Kedua bentuk K melangkah lebih jauh dan juga melipat karakter kompatibilitas — A lebar-penuh menjadi sebuah A polos, dan ligatur fi menjadi fi — yang berguna untuk pencarian dan pencocokan dan berkehilangan untuk penyimpanan.
Panel di sini menampilkan keempat bentuk dari apa pun yang Anda tempel dan menandai yang mana dari mereka berbeda dari masukan. Jika tak ada yang berbeda, teksnya sudah dinormalisasi dan ketidakcocokan yang Anda kejar ada di tempat lain. Jika beberapa berbeda, Anda telah menemukannya.
Nama, kategori, aksara, dan blok
Setiap karakter yang ditetapkan membawa empat bagian identitas, dan mereka menjawab pertanyaan berbeda. Nama adalah karakter itu sendiri. Kategori umum mengatakan jenis hal apa itu — sebuah huruf kecil, sebuah tanda gabungan, sebuah simbol mata uang, sebuah kontrol format. Aksara adalah sistem tulisan yang dimilikinya. Blok adalah rentang titik kode tempat ia ditetapkan, yang merupakan fakta organisasional ketimbang linguistik.
Blok dan aksara mudah dikelirukan dan sering tak sepakat. Huruf Latin tinggal di setidaknya setengah lusin blok, dan sebuah blok bisa menampung karakter dari beberapa aksara. Ketika Anda ingin tahu "alfabet apa ini", aksara adalah jawabannya; ketika Anda ingin tahu "di mana dalam standar ini tinggal", blok adalah jawabannya.
Nama, aksara, dan blok ditampilkan dalam bahasa Inggris di sini dalam setiap bahasa, secara sengaja. Mereka adalah pengenal yang didefinisikan standar, bukan prosa — U+200D dinamai ZERO WIDTH JOINER di mana pun di dunia, dan menerjemahkannya akan membuatnya mustahil dicari.
Pengodean dan escape
Sebuah titik kode adalah sebuah angka; ia menjadi bita hanya setelah sebuah pengodean dipilih. UTF-8 memakai antara satu dan empat bita dan menjaga ASCII tak berubah, itulah sebabnya ia menang. UTF-16 memakai satu atau dua unit 16-bit, dan ia adalah yang menyusun string JavaScript — itulah sebabnya .length melaporkan 2 untuk satu emoji.
U+0041 41 # UTF-8: one byte, same as ASCII U+00E9 C3 A9 # UTF-8: two bytes U+20AC E2 82 AC # UTF-8: three bytes U+1F600 F0 9F 98 80 # UTF-8: four bytes
Tiap baris di sini juga memberi karakter yang ditulis sebagai sebuah escape dalam JavaScript, JSON, HTML, CSS, URL, dan Python, siap disalin. Itu tak semua sama, dan perbedaannya penting di atas BMP: JavaScript dan Python punya sebuah escape titik-kode dan memakainya, sementara JSON tak punya dan harus mengeja sebuah emoji sebagai dua paruh surogatnya.
Pertanyaan yang sering diajukan
- Mengapa string saya lebih panjang daripada jumlah karakter yang bisa saya lihat?
- Entah ia mengandung karakter tak terlihat, atau ia mengandung grafem yang dibangun dari beberapa titik kode. Keduanya ditampilkan di sini: karakter tak terlihat ditandai, dan grafem multi-titik-kode dikelompokkan sehingga Anda bisa melihat satu karakter dan beberapa nilai yang menyusunnya.
- Dua string tampak identik tetapi tak sama. Mengapa?
- Biasanya normalisasi. Sebuah huruf beraksen bisa satu titik kode atau sebuah huruf plus sebuah tanda gabungan, dan keduanya tampil sama. Tempel tiap string di sini dan bandingkan daftar titik kodenya, atau lihat bentuk normalisasi mana yang berbeda dari masukan.
- Apa itu spasi lebar-nol dan bagaimana ia masuk ke teks saya?
- Ia adalah sebuah karakter tanpa lebar dan tanpa bekas, dipakai untuk menyarankan sebuah kesempatan pemutus-baris. Ia biasanya tiba dengan menyalin teks keluar dari sebuah halaman web, penyunting dokumen, atau klien obrolan, dan karena tak ada yang tampil, ia bertahan setiap tinjauan sampai sesuatu membandingkan string dan gagal.
- Apa perbedaan antara titik kode dan karakter?
- Sebuah titik kode adalah satu nilai Unicode. Sebuah karakter dalam pengertian sehari-hari adalah sebuah grafem — yang dihitung seorang pembaca sebagai satu — dan sebuah grafem bisa berupa beberapa titik kode. Sebuah emoji keluarga adalah lima titik kode dan satu grafem.
- Mengapa alat mengatakan beberapa karakter tak punya nama?
- Empat alasan berbeda, dan ia mengatakan yang mana. Surogat dan titik kode penggunaan-pribadi tak punya nama dalam standar, yang tak ditetapkan tak punya apa pun untuk dinamai, dan sebuah karakter dalam blok historis yang jarang diperiksa punya sebuah nama yang build ini tak membawanya — tabel nama menjaga blok yang orang benar-benar tempel darinya ketimbang mengirim semuanya.
- Apakah sebuah peringatan aksara-campur bukti sebuah serangan?
- Tidak. Ia berarti satu kata menarik hurufnya dari lebih dari satu sistem tulisan, yang merupakan bentuk yang dimiliki nama palsu dan juga sesuatu yang teks biasa lakukan sesekali. Ia adalah alasan untuk melihat, bukan sebuah vonis.
- Apakah ada yang saya tempel dikirim ke server?
- Tidak. Basis data karakter diunduh bersama halaman dan semuanya berjalan di browser Anda; tidak ada yang Anda ketik diunggah atau dicatat, dan ia bekerja tanpa koneksi jaringan.