Apa sebenarnya teks itu, dan mengapa alat-alat berbeda pendapat tentangnya
File teks adalah byte ditambah encoding, dan encoding-nya tidak disimpan di dalam file. Hanya konvensi yang memberi tahu program bahwa byte tertentu berarti “é” — itulah sebabnya file yang sama terbuka dengan benar di satu tempat dan menjadi “é” di tempat lain. UTF-8 adalah jawaban modern dan menyimpan huruf Latin umum dalam satu byte, huruf beraksen dalam dua, serta sebagian besar aksara Tionghoa, Jepang, Arab, dan semua emoji dalam tiga atau empat. UTF-16 dipakai secara internal oleh Windows dan JavaScript, dan menyimpan hampir semuanya dalam dua byte dan sisanya dalam empat. Windows-1252 dan Latin-1 adalah encoding satu byte yang masih dihasilkan sistem lama, dan keduanya sumber umum mojibake. Yang perlu diketahui tentang halaman-halaman ini: Penampil CSV mendeteksi encoding file yang Anda letakkan, termasuk UTF-16 dan Windows-1252, dan memungkinkan Anda menggantinya. Kotak teks biasa tidak — file yang diletakkan dibaca sebagai UTF-8, jadi ekspor Latin-1 akan menampilkan huruf beraksennya dengan salah, dan solusinya adalah mengonversinya terlebih dahulu.
“Karakter” punya empat arti, dan yang Anda butuhkan bergantung pada siapa yang membatasi. Apa yang dilihat orang sebagai satu karakter adalah grapheme cluster. Apa yang dicocokkan regular expression adalah code point. Apa yang dilaporkan string.length di JavaScript adalah unit UTF-16. Apa yang diukur kolom database atau header HTTP adalah byte UTF-8. Untuk teks bahasa Inggris biasa keempatnya sama, itulah sebabnya tidak ada yang sadar — lalu emoji keluarga ternyata satu grapheme, tujuh code point, sebelas unit UTF-16, dan dua puluh lima byte, dan pesan 200 karakter ditolak oleh kolom berkapasitas 255 karakter. Hitung Karakter menampilkan keempatnya justru karena alasan ini.
Karakter tak terlihat tetaplah karakter. Non-breaking space terlihat persis seperti spasi tetapi merupakan karakter yang sama sekali berbeda — karakter ini terus-menerus terbawa dalam teks yang disalin dari halaman web atau pengolah kata, dan merusak pencarian, parsing CSV, serta kode yang memisahkan teks berdasarkan spasi. Zero-width joiner adalah yang menyatukan emoji berisi beberapa orang. Soft hyphen, tanda arah, dan byte-order mark semuanya ikut terbawa bersama teks yang ditempel. Tak satu pun muncul di layar, jadi satu-satunya tanda yang Anda dapat adalah hitungan yang tidak cocok dengan apa yang terlihat — dan itulah salah satu kegunaan jujur penghitung karakter. Perlu dicatat, opsi abaikan spasi di Bandingkan Teks meringkas spasi dan tab biasa; opsi itu tidak menganggap non-breaking space sebagai spasi, karena keduanya memang bukan hal yang sama.
Akhir baris adalah alasan diff kadang menampilkan setiap baris sebagai berubah. Windows mengakhiri baris dengan carriage return dan line feed; sistem lain hanya memakai line feed. Simpan file LF dari editor Windows dan setiap barisnya kini berbeda satu byte tak terlihat, sehingga perbandingan tingkat byte — git diff, diff(1) — melaporkan seluruh file sebagai ditulis ulang dan menyembunyikan satu perubahan yang sebenarnya Anda buat. Bandingkan Teks dan Hapus Baris Duplikat kami memisahkan baris berdasarkan ketiga konvensi sebelum membandingkan, jadi file yang hanya berubah akhir barisnya tidak muncul di sini sebagai dinding merah. Itu kemudahan di alat untuk membaca, tetapi jebakan di repositori: perbaiki dari sumbernya dengan editor Anda atau dengan pengaturan akhir baris milik git sendiri.
Dua string yang tampak identik bisa dianggap berbeda, dan normalisasi biasanya penyebabnya. Unicode bisa menulis “é” dengan dua cara: sebagai satu code point, atau sebagai “e” biasa diikuti tanda aksen akut penggabung. Tampilannya sama tetapi urutan byte-nya berbeda, sehingga perbandingan, penghapusan duplikat, atau pencarian di database memperlakukannya sebagai dua nilai berbeda. macOS dan Windows sejak dulu berbeda pendapat soal bentuk mana yang dipakai untuk nama file, dan begitulah daftar yang dikumpulkan dari dua komputer berakhir dengan entri yang tampak seperti duplikat persis tetapi tidak bisa dihapus duplikatnya. Hitung Karakter adalah cara Anda menemukannya — kedua bentuk punya jumlah grapheme yang sama dan jumlah code point yang berbeda. Tidak ada alat di sini yang mengonversi antarbentuk; itu tugas satu baris untuk skrip dengan library Unicode, seperti unicodedata.normalize di Python.
“Jumlah kata” adalah penilaian, bukan pengukuran. Memisahkan berdasarkan spasi adalah aturan bahasa Inggris, dan menerapkannya pada bahasa Tionghoa, Jepang, atau Thai — yang tidak memberi spasi di antara kata — membuat artikel panjang dilaporkan sebagai satu kata. Penghitung kami memakai segmentasi kata Unicode milik browser, yang tahu di mana kata dimulai dalam setiap aksara. Perbedaan yang tersisa menyangkut tanda hubung (“well-known” dihitung satu kata di sini dan di Word, dua di beberapa alat), angka yang berdiri sendiri, dan apa yang dihitung sebagai kalimat — “We met Dr. Smith” adalah satu kalimat, sedangkan pemisah yang naif menghitungnya dua. Waktu baca adalah perkiraan tambahan di atasnya: 238 kata per menit untuk membaca dalam hati, berdasarkan meta-analisis, bukan angka bulat yang disalin dari satu blog ke blog lain.