Panjang string

Hitung teks dengan lima cara sekaligus: karakter seperti yang Anda lihat, titik kode (len() di Python), unit UTF-16 (.length di JavaScript), kata, dan baris.

Masukan
Karakter
0
Titik kode
0
Unit UTF-16
0
Kata
0
Baris
0

Mengapa "seberapa panjang string ini?" punya lebih dari satu jawaban

Kedengarannya pertanyaan sepele, tetapi panjang sepotong teks bergantung sepenuhnya pada apa yang Anda hitung. Seseorang menghitung karakter yang bisa dilihatnya. Basis data menghitung penyimpanan yang ditempati nilai. JavaScript menghitung sesuatu yang berbeda lagi. Ketika angka-angka ini tak sepakat — dan sering demikian untuk emoji, huruf beraksen, dan aksara non-Latin — satu "panjang" menjadi menyesatkan. Alat ini menampilkan lima ukuran bermakna berdampingan sehingga Anda bisa memilih yang penting untuk situasi Anda.

Kelima metrik dijelaskan

  • Karakter (grafem): apa yang dirasakan manusia sebagai satu karakter. Emoji keluarga seperti 👨‍👩‍👧, atau huruf dengan aksen gabungan, dihitung satu — inilah hitungan yang cocok dengan "secara kasat mata".
  • Titik kode: jumlah nilai skalar Unicode. Satu karakter yang terlihat bisa dibangun dari beberapa titik kode yang digabung, jadi angka ini sering lebih tinggi daripada hitungan grafem.
  • Unit UTF-16: nilai yang dilaporkan JavaScript dari properti .length string. Karakter di luar Basic Multilingual Plane (kebanyakan emoji) masing-masing menempati dua unit UTF-16.
  • Kata: jumlah token serupa-kata, dideteksi dengan cara yang sadar Unicode ketimbang memecah pada spasi secara naif.
  • Baris: jumlah baris, menghitung setiap pemutus baris.

Mengapa emoji dan aksen merusak penghitungan naif

Teks modern dibangun dari Unicode, yang merepresentasikan banyak karakter terlihat sebagai urutan ketimbang unit tunggal. Emoji bendera adalah dua simbol penanda-wilayah. Emoji keluarga adalah beberapa orang yang digabung oleh karakter "penggabung lebar-nol" yang tak terlihat. É beraksen bisa berupa satu titik kode atau e polos diikuti aksen gabungan. Masing-masing tampak seperti satu karakter tetapi bisa dihitung dua, tiga, atau lebih bergantung pada metriknya. Persis itulah sebabnya menghitung dengan tangan, atau memercayai satu angka, menyebabkan bug.

Hitungan mana yang sebaiknya Anda pakai?

  • Batas karakter yang dilihat orang (bio, bidang bergaya-tweet, pratinjau SMS): pakai Karakter (grafem), karena itu cocok dengan yang dihitung pengguna.
  • Penanganan string JavaScript, pengindeksan larik, atau pemotongan: pakai unit UTF-16, karena itulah yang menjadi dasar .length dan indeks string.
  • Ukuran kolom basis data: periksa apakah kolom Anda diukur dalam karakter atau bita — banyak yang dibatasi bita, dan bita UTF-8 berbeda lagi dari semua hitungan ini.
  • Hitungan kata atau baris untuk penyunting dan keterbacaan: pakai metrik Kata dan Baris.

Apa yang disebut panjang oleh Python dan JavaScript

Dua dari lima hitungan di atas adalah yang paling sering membawa orang ke halaman ini, dan keduanya milik bahasa yang berbeda. len() di Python dan .length di JavaScript sama-sama disebut panjang string, dan pada apa pun yang melampaui ASCII polos keduanya menjawab berbeda untuk teks yang sama pada saat yang sama. Tak satu pun keliru: keduanya menghitung unit yang berbeda, dan kedua kotak ditampilkan di atas supaya selisihnya bisa dibaca, bukan ditebak.

  • Python: len() mengembalikan jumlah titik kode Unicode, karena string di Python 3 adalah urutan titik kode. Lihat kotak "Titik kode" — itulah angka yang akan diberikan len().
  • JavaScript: .length mengembalikan jumlah unit kode UTF-16, karena string JavaScript disimpan sebagai UTF-16. Lihat kotak "Unit UTF-16". Sebaliknya, Array.from(text).length menelusuri string titik kode demi titik kode, sehingga hasilnya sama dengan Python.
  • Tak satu pun dari keduanya menghitung apa yang Anda lihat. Kotak "Karakter" adalah hitungan grafem, dan tidak ada panjang bawaan di kedua bahasa itu yang menghasilkannya: JavaScript perlu Intl.Segmenter dan Python perlu paket pihak ketiga. Kalau batas yang Anda terapkan akan dibaca orang, kotak itulah yang Anda perlukan.
  • Kata dan Baris juga bukan milik salah satu bahasa itu. Keduanya bisa mendekatinya dengan memecah pada spasi dan pada pemutus baris, dan keduanya menyimpang dari hitungan di sini, yang sadar Unicode — pada teks yang ditulis tanpa spasi, pada tanda baca, dan pada pemutus baris yang mengakhiri teks.

Contoh di balik Muat contoh adalah cara tercepat untuk melihat selisihnya. Emoji keluarga di dalamnya adalah satu karakter bagi pembaca, lima titik kode bagi Python, dan delapan unit UTF-16 bagi JavaScript: tiga dari lima titik kode itu berada di luar Basic Multilingual Plane dan memakan dua unit masing-masing, sedangkan dua penggabung tak terlihat di antaranya memakan satu unit. Jadi kolom yang membolehkan orang menulis dua puluh karakter memang memuat dua puluh secara kasat mata, sementara pemeriksaan naif yang ditulis di salah satu bahasa itu menolak teks yang sebenarnya muat.

Panjang bukan ukuran dalam bita

Tak satu pun dari lima hitungan di atas adalah hitungan bita, dan keduanya mudah tertukar. Hitungan adalah sifat teks itu sendiri; ukuran dalam bita adalah sifat teks setelah ditulis dalam suatu pengodean, sehingga string yang sama menempati satu ukuran dalam UTF-8 dan ukuran lain dalam UTF-16. Karena itu apa pun yang diukur dengan bita harus diukur setelah pengodean, dan pengodean mana yang dipilih adalah bagian dari jawabannya.

  • UTF-8 dipakai hampir semua hal, dan lebarnya berubah-ubah: satu huruf, angka, atau tanda baca ASCII adalah satu bita, kebanyakan karakter beraksen dan non-Latin dua atau tiga, dan banyak emoji empat. Seratus karakter baru menjadi seratus bita kalau semuanya ASCII — seratus karakter yang sama dalam bahasa Yunani, Ibrani, Arab, atau Tionghoa beratnya dua sampai tiga kali lipat.
  • Python: len() menghitung titik kode, jadi kodekan dulu sebelum mengukur. len(text.encode('utf-8')) adalah jumlah bita UTF-8, dan menyebut codec lain di situ memberi angka lain, dan justru itulah intinya.
  • JavaScript: .length menghitung unit UTF-16, jadi itu pun bukan hitungan bita. new TextEncoder().encode(text).length memberi jumlah bita UTF-8, baik di peramban maupun di Node, dan TextEncoder hanya menghasilkan UTF-8, jadi tidak ada codec yang perlu disebut.
  • Periksa dulu satuan yang dipakai batas Anda sebelum menghitung apa pun. Sebagian mesin basis data mendeklarasikan kolom dalam karakter dan sebagian lagi dalam bita, nilai tajuk HTTP dan ukuran berkas adalah bita, dan aturan yang ditulis untuk orang adalah apa yang ditampilkan kotak "Karakter". Semua yang diukur dengan karakter sudah ada di atas; semua yang diukur dengan bita menuntut panjang setelah pengodean.

Setelah jumlah bita ada di tangan, Konverter ukuran bita adalah tempat melanjutkannya: ia mengubah angka bita mentah ke dua sistem satuan sekaligus — yang bertumpu pada pangkat seribu dan yang bertumpu pada pangkat dua — dan menunjukkan bagaimana setiap alat di mesin Anda melaporkan ukuran yang sama. Halaman ini berhenti di tempat pengodean dimulai; halaman itu justru dimulai dari angka bita.

Pertanyaan yang sering diajukan

Hitungan mana yang cocok dengan panjang string JavaScript?
Nilai unit UTF-16 cocok dengan properti .length mentah di JavaScript. Jika kode Anda memotong atau mengindeks string, inilah angka yang mengatur perilakunya.
Mengapa satu emoji dihitung sebagai beberapa karakter?
Banyak emoji tersusun dari beberapa titik kode Unicode yang digabung. Sebagai grafem (yang Anda lihat) ia satu karakter, tetapi hitungan titik kode dan UTF-16-nya lebih tinggi, itulah sebabnya tiap ukuran ditampilkan terpisah.
Apakah ia menghitung spasi dan baris-baru di ujung?
Ya. Setiap karakter yang Anda tempel dihitung, termasuk spasi di awal dan ujung serta pemutus baris. Jika total Anda tampak lebih tinggi dari yang diharapkan, periksa spasi tak terlihat di ujung.
Apakah teks saya dikirim ke server?
Tidak. Semua penghitungan terjadi di peramban Anda. Teks yang Anda ketik atau tempel tidak pernah meninggalkan perangkat Anda.
Apa itu grafem?
Grafem, atau "gugus grafem", adalah karakter sebagaimana dirasakan pengguna — unit terkecil yang akan disebut seorang pembaca sebagai satu karakter, meski ia dibangun dari beberapa titik kode yang mendasarinya.
Bagaimana bita berbeda dari hitungan-hitungan ini?
Bita bergantung pada pengodean. Dalam UTF-8, huruf ASCII adalah satu bita, kebanyakan karakter beraksen dan non-Latin dua atau tiga, dan banyak emoji empat. Tak satu pun dari kelima metrik di sini adalah hitungan bita, jadi untuk bidang yang dibatasi bita Anda sebaiknya mengodekan ke UTF-8 dulu.

Alat terkait

  • Konverter ukuran bita

    Tidak satu pun hitungan di sini adalah ukuran dalam bita: ukuran baru ada setelah teks dikodekan. Begitu angka itu ada di tangan Anda, halaman itu membacanya dalam unit desimal dan biner berdampingan, dan menyebutkan nama yang diberikan tiap sistem operasi kepadanya.

  • Penguji regex

    Uji ekspresi reguler — cocok, ganti, pisah.

  • Diff teks

    Bandingkan dua teks — setiap baris dan kata yang berubah.

  • Inspektur karakter Unicode

    Lihat persis dari karakter apa string terbuat.