Bagaimana saya bisa mendapatkan jumlah karakter string di Go?
Sebagai contoh, jika saya memiliki string "hello"
metode harus kembali 5
. Saya melihat bahwa len(str)
mengembalikan jumlah byte dan bukan jumlah karakter sehingga len("£")
mengembalikan 2 bukannya 1 karena £ dikodekan dengan dua byte di UTF-8.
string
go
character
string-length
Ammar
sumber
sumber
Jawaban:
Anda dapat mencoba
RuneCountInString
dari paket utf8.bahwa, seperti yang diilustrasikan dalam skrip ini : panjang "Dunia" mungkin 6 (ketika ditulis dalam bahasa Cina: "世界"), tetapi jumlah rune-nya adalah 2:
Phrozen menambahkan dalam komentar :
Sebenarnya Anda bisa melakukan
len()
lebih dari rune hanya dengan mengetik casting.len([]rune("世界"))
akan dicetak2
. Paling tidak aktif Go 1.3.Dan dengan CL 108985 (Mei 2018, untuk Go 1.11),
len([]rune(string))
sekarang dioptimalkan. ( Masalah perbaikan 24923 )Compiler mendeteksi
len([]rune(string))
pola secara otomatis, dan menggantinya dengan untuk r: = range s call.Stefan Steiger menunjuk ke posting blog " Normalisasi teks di Go "
Apa itu karakter?
Menggunakan paket itu dan
Iter
tipenya , jumlah sebenarnya "karakter" adalah:Di sini, ini menggunakan bentuk Normalisasi Unicode NFKD "Dekomposisi Kompatibilitas"
Oliver 's jawaban poin untuk UNICODE TEXT SEGMENTASI sebagai satu-satunya cara untuk andal menentukan batas-batas standar di antara unsur-unsur tertentu yang signifikan teks: karakter yang dirasakan pengguna, kata, dan kalimat.
Untuk itu, Anda memerlukan perpustakaan eksternal seperti rivo / uniseg , yang melakukan Segmentasi Teks Unicode .
Itu benar-benar akan menghitung " grapheme cluster ", di mana beberapa titik kode dapat digabungkan menjadi satu karakter yang dirasakan pengguna.
Dua grafem, meskipun ada tiga rune (titik kode Unicode).
Anda dapat melihat contoh lain di " Cara memanipulasi string di GO untuk membalikkannya? "
👩🏾🦰 sendiri adalah satu grapheme, tetapi, dari unicode ke konverter poin poin , 4 rune:
sumber
Ada cara untuk mendapatkan hitungan rune tanpa paket apa pun dengan mengonversi string ke [] rune sebagai
len([]rune(YOUR_STRING))
:sumber
Tergantung pada definisi Anda tentang apa "karakter" itu. Jika "Rune sama dengan karakter" adalah OK untuk tugas Anda (umumnya tidak) maka jawaban oleh VonC sangat cocok untuk Anda. Kalau tidak, harus dicatat, bahwa ada beberapa situasi di mana jumlah rune dalam string Unicode adalah nilai yang menarik. Dan bahkan dalam situasi-situasi itu lebih baik, jika mungkin, untuk menyimpulkan jumlah sambil "melintasi" string saat rune diproses untuk menghindari penggandaan upaya decode UTF-8.
sumber
String
..length()
Metode Java tidak mengembalikan jumlah karakter juga. Juga tidak KakaoNSString
's-length
metode. Mereka hanya mengembalikan jumlah entitas UTF-16. Tetapi jumlah sebenarnya dari titik-titik codep jarang digunakan, karena butuh waktu linier untuk menghitungnya.Jika Anda perlu mempertimbangkan cluster grapheme, gunakan modul regexp atau unicode. Menghitung jumlah titik kode (rune) atau byte juga diperlukan untuk validaiton karena panjang grapheme cluster tidak terbatas. Jika Anda ingin menghilangkan urutan yang sangat panjang, periksa apakah urutannya sesuai dengan format teks stream-safe .
sumber
var
luar fungsi.Ada beberapa cara untuk mendapatkan panjang tali:
sumber
Saya harus menunjukkan bahwa tidak ada jawaban yang diberikan sejauh ini memberi Anda jumlah karakter seperti yang Anda harapkan, terutama ketika Anda berurusan dengan emoji (tetapi juga beberapa bahasa seperti Thailand, Korea, atau Arab). Saran VonC akan menampilkan yang berikut:
Itu karena metode ini hanya menghitung poin kode Unicode. Ada banyak karakter yang dapat terdiri dari beberapa titik kode.
Sama untuk menggunakan paket Normalisasi :
Normalisasi tidak benar-benar sama dengan menghitung karakter dan banyak karakter tidak dapat dinormalisasi menjadi setara dengan satu kode-poin.
Jawaban masakielastic mendekati tetapi hanya menangani pengubah (bendera pelangi mengandung pengubah yang dengan demikian tidak dihitung sebagai titik kode sendiri):
Cara yang benar untuk membagi string Unicode menjadi karakter (yang dirasakan pengguna), yaitu cluster grapheme, didefinisikan dalam Unicode Standard Annex # 29 . Aturan dapat ditemukan di Bagian 3.1.1 . The github.com/rivo/uniseg paket alat aturan ini sehingga Anda dapat menentukan jumlah yang benar dari karakter dalam string:
sumber
Saya mencoba melakukan normalisasi sedikit lebih cepat:
sumber