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 memuatnya, bita yang ditempatinya dalam UTF-8 dan UTF-16, dan urutan escape yang dibutuhkannya dalam enam format berbeda.
Kebanyakan orang datang ke sini karena ada sesuatu yang tidak cocok. String lebih panjang dari tampaknya, dua nilai yang tampil identik menolak dinilai sama ketika dibandingkan, 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: karakter melakukan sesuatu yang tak ditampilkan layar.
Karakter, titik kode, dan grafem
Kata "karakter" berarti setidaknya tiga hal berbeda, dan dari mencampuradukkannya itulah kebanyakan kebingungan Unicode bermula. Titik kode adalah satu nilai dalam standar Unicode, ditulis U+0041 atau U+1F600. Grafem adalah yang dihitung seorang pembaca sebagai satu karakter. Mereka sering bukan angka yang sama.
- "a" polos adalah 1 grafem, 1 titik kode, 1 unit UTF-16 — semua sepakat.
- U+00E9, e-akut prakomposisi, adalah 1 grafem, 1 titik kode, 1 unit UTF-16.
- U+0065 U+0301, huruf yang sama ditulis sebagai e plus 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 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 banyaknya sama sekali tak menggambar apa pun. Mereka ada untuk mengendalikan cara teks di sekitarnya berperilaku, dan karena mereka tak meninggalkan bekas mereka bertahan penyalinan, penempelan, dan tinjauan tanpa ada yang menyadari. Inilah yang ditunjuk alat ini alih-alih sekadar didaftarnya:
- 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) — saran tentang di mana kata boleh patah, tak terlihat sampai ia patah.
- Spasi tak-pemutus (U+00A0) — tampak persis seperti spasi dan merupakan karakter berbeda, itulah sebabnya ia bertahan begitu lama dalam berkas konfigurasi.
- Tanda urutan bita (U+FEFF) — sering ditinggalkan di awal 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 penimpaan yang ditaruh di dalam komentar atau 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 padahal bukan huruf itu. Kiril а, Yunani ο, dan Latin a menempati titik kode berbeda dan tampil sama di kebanyakan font. 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 menandai merah setiap kata Rusia, Yunani, atau Ibrani, dan peringatan yang muncul pada teks biasa adalah peringatan yang lama-lama diabaikan orang. Jadi aturan di sini adalah yang dipakai standar keamanan Unicode — 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.
- Kata Rusia utuh dalam Kiril: satu sistem tulisan, teks biasa, tak ditandai.
- Kalimat Jepang memakai Han, Hiragana, dan Katakana bersama: tiga aksara, satu sistem tulisan, tak ditandai.
Kasus terakhir itu adalah alasan aturan butuh kehati-hatian. Bahasa Jepang ditulis dengan tiga aksara sekaligus dan bahasa Korea mencampur dua, jadi uji naif "lebih dari satu aksara mencurigakan" akan menyebut setiap kalimat Jepang 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 — e polos diikuti 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 itulah yang diasumsikan web secara default; NFD mendekomposisi sebagai gantinya. Kedua bentuk K melangkah lebih jauh dan juga melipat karakter kompatibilitas — A lebar-penuh menjadi 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 — huruf kecil, tanda gabungan, simbol mata uang, kontrol format. Aksara adalah sistem tulisan yang memuatnya. 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 blok bisa menampung karakter dari beberapa aksara. Ketika Anda ingin tahu "alfabet apa ini", aksara adalah jawabannya; ketika Anda ingin tahu "di mana ia tinggal dalam standar", 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
Titik kode adalah angka; ia menjadi bita hanya setelah 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 escape dalam JavaScript, JSON, HTML, CSS, URL, dan Python, siap disalin. Semuanya tidak sama, dan perbedaannya penting di atas BMP: JavaScript dan Python punya escape titik-kode dan memakainya, sementara JSON tak punya dan harus mengeja emoji sebagai dua paruh surogatnya.
Karakter tersembunyi, dan teks yang keluar dari model AI
Banyak teks yang ditempel di sini bukan diketik oleh orang yang menempelnya: ia disalin dari dokumen, dari halaman web, dari tiket, atau dari jawaban asisten, dan pertanyaan yang datang bersamanya adalah apakah ia membawa karakter yang tak bisa dilihat. Itulah yang dijawab alat ini, dan ada gunanya menyebut sejauh mana jawabannya berlaku: teks diuraikan menjadi titik-titik kodenya, masing-masing dengan namanya bila standar memberinya nama, dan yang layak dilihat dua kali dihitung pada satu baris di atas daftar. Bila baris itu tak muncul, tak ada yang ditemukan.
Apa yang dibuktikan karakter tersembunyi lebih sempit daripada yang disiratkan hampir semua tulisan tentang hal ini. Tak ada di dalam titik kode yang mencatat dari mana ia datang: yang masuk lewat penyalinan dari sistem manajemen konten dan yang masuk bersama jawaban yang dihasilkan adalah nilai yang sama. Karakter tak terlihat memang pernah dilaporkan pada keluaran model bahasa besar, dan pada kasus yang paling menarik perhatian — spasi tak-pemutus sempit di tempat yang semestinya spasi biasa — pembuat model menjawab bahwa itu produk sampingan pelatihan dan bukan sesuatu yang sengaja ditaruh, dan laporannya berhenti dalam hitungan hari. Jadi temuan di sini memberi tahu apa yang harus dihapus. Ia tak memberi tahu apa yang menulis kalimat itu.
- Spasi yang bukan spasi biasa. Spasi tak-pemutus (U+00A0) dan spasi tak-pemutus sempit (U+202F) paling sering disebut; masing-masing kira-kira selebar spasi, masing-masing karakter yang berbeda, dan alat ini menandai keduanya.
- Karakter tanpa lebar sama sekali. Spasi lebar-nol (U+200B), penggabung kata (U+2060), dan tanda urutan bita (U+FEFF) tak menggambar apa pun, bertahan dari tinjauan, dan merusak perbandingan pertama yang mereka sentuh. Keduanya ditandai sebagai tak terlihat.
- Blok Tags (U+E0000 sampai U+E007F). Ia memuat satu titik kode tak terlihat untuk tiap karakter ASCII yang tercetak — nama U+E0041 adalah TAG LATIN CAPITAL LETTER A — sehingga satu kalimat utuh bisa dieja di dalam teks yang sama sekali tak menampilkan apa pun. Di sini tiap satunya diberi nama dan ditandai sebagai tak terlihat.
- Tanda baca yang disalahkan dan yang tak tersembunyi. Tanda pisah em (U+2014) dan apostrof melengkung (U+2019) menggambar bekas yang terlihat, jadi di sini tak ada yang menandainya; keduanya tipografi biasa, apa pun yang menghasilkannya.
Dua alasan untuk menjalankan pemeriksaan layak dipisahkan. Yang sehari-hari, karakter tak terlihat merusak sesuatu diam-diam: perbandingan yang semestinya cocok, kunci pencarian, ruas yang menolak masukan Anda tanpa mengatakan mengapa. Yang lain, teks dibaca program sebanyak ia dibaca orang: karakter dalam blok Tags disiapkan untuk penanda bahasa, tak menggambar apa pun di kebanyakan penyunting dan diff, tetapi sesuatu yang membaca teks alih-alih memandangnya tetap membacanya. Bila Anda menempel jawaban panjang secara utuh, perhatikan bahwa daftar barisnya dipangkas dan hitungannya tidak: hitungan diambil atas seluruh yang Anda tempel.
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. Huruf beraksen bisa satu titik kode atau huruf plus 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 karakter tanpa lebar dan tanpa bekas, dipakai untuk menyarankan kesempatan pemutus-baris. Ia biasanya tiba dengan menyalin teks keluar dari 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?
- Titik kode adalah satu nilai Unicode. Karakter dalam pengertian sehari-hari adalah grafem — yang dihitung seorang pembaca sebagai satu — dan grafem bisa berupa beberapa titik kode. 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 karakter dalam blok historis yang jarang diperiksa punya nama yang build ini tak membawanya — tabel nama menjaga blok yang orang benar-benar tempel darinya ketimbang mengirim semuanya.
- Apakah peringatan aksara-campur bukti 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 vonis.
- Apakah ada yang saya tempel dikirim ke server?
- Tidak. Basis data karakter diunduh bersama halaman dan semuanya berjalan di peramban Anda; tidak ada yang Anda ketik diunggah atau dicatat, dan ia bekerja tanpa koneksi jaringan.
- Apakah teks dari model AI mengandung karakter tak terlihat?
- Kadang, dan tak pernah dengan cara yang mengidentifikasi apa pun. Kasus yang paling menarik perhatian adalah spasi tak-pemutus sempit (U+202F) yang muncul pada jawaban panjang di tempat yang semestinya spasi biasa; pembuat model menjawab bahwa itu produk sampingan pelatihan dan bukan sesuatu yang sengaja ditaruh, dan dalam hitungan hari ia tak terlihat lagi. Tempel teks Anda di sini dan Anda akan melihat apa yang ada di dalamnya. Yang tak akan Anda lihat adalah dari mana ia datang, karena titik kode tak mencatat hal itu.
- Bagaimana saya menemukan dan menghapus karakter tersembunyi dalam teks saya?
- Tempel di sini untuk menemukannya: tiap titik kode mendapat satu baris, dengan namanya bila ada, dan yang layak dilihat dua kali dihitung di atas daftar. Menghapusnya adalah pekerjaan penyunting Anda — di sini tak ada yang menulis ulang teks Anda — tetapi begitu Anda tahu titik kode mana yang dikejar, tiap baris memberikannya sebagai escape dalam enam format, dan itulah yang diminta kotak pencarian yang memahami escape.
- Apakah tanda pisah em atau tanda kutip melengkung termasuk karakter tersembunyi?
- Tidak. Tanda pisah em (U+2014) dan apostrof melengkung (U+2019) sama-sama menggambar bekas di layar, jadi di sini tak ada yang menandainya. Keduanya kerap diajukan sebagai tanda tulisan yang dihasilkan mesin, dan itu soal gaya yang tak bisa dijawab pemeriksa karakter. Meski begitu keduanya layak dikenali karena alasan lain: tak satu pun dari keduanya ASCII, jadi keduanya bisa mengganggu sesuatu yang mengharapkannya, dan string yang ditulis dengan keduanya tidak sama dengan string yang sama diketik memakai tanda hubung dan apostrof lurus.
Alat terkait
- Pembuat slug URL
Ubah judul apa pun menjadi slug URL yang bersih.
- Konverter huruf besar-kecil
Konversi antara camelCase, snake_case, Title Case, dan lainnya.
- Penghitung token LLM
Hitung persis berapa token yang dihabiskan teks Anda, di peramban.
- Panjang string
Hitung karakter, kata, dan baris — sadar Unicode.