Dalam kode JavaScript saya, saya perlu menulis pesan ke server dalam format ini:
<size in bytes>CRLF
<data>CRLF
Contoh:
3
foo
Data mungkin berisi karakter unicode. Saya perlu mengirimnya sebagai UTF-8.
Saya mencari cara paling lintas browser untuk menghitung panjang string dalam byte di JavaScript.
Saya sudah mencoba ini untuk menyusun muatan saya:
return unescape(encodeURIComponent(str)).length + "\n" + str + "\n"
Tapi itu tidak memberi saya hasil yang akurat untuk browser lama (atau, mungkin string di browser tersebut di UTF-16?).
Ada petunjuk?
Memperbarui:
Contoh: panjang dalam byte dari string ЭЭХ! Naïve?
di UTF-8 adalah 15 byte, tetapi sebagai gantinya beberapa browser melaporkan 23 byte.
javascript
unicode
Alexander Gladysh
sumber
sumber
Jawaban:
Tidak ada cara untuk melakukannya di JavaScript secara native.(Lihat jawaban Riccardo Galli untuk pendekatan modern.)Untuk referensi historis atau di mana API TextEncoder masih tidak tersedia .
Jika Anda mengetahui pengkodean karakter, Anda dapat menghitungnya sendiri.
encodeURIComponent
mengasumsikan UTF-8 sebagai pengkodean karakter, jadi jika Anda membutuhkan pengkodean itu, Anda dapat melakukannya,Ini seharusnya berfungsi karena cara UTF-8 mengkodekan urutan multi-byte. Byte pertama yang dikodekan selalu dimulai dengan bit nol tinggi untuk urutan byte tunggal, atau byte yang digit hex pertamanya adalah C, D, E, atau F. Byte kedua dan selanjutnya adalah byte yang dua bit pertamanya adalah 10 Itu adalah byte ekstra yang ingin Anda hitung dalam UTF-8.
Tabel di wikipedia membuatnya lebih jelas
Jika Anda perlu memahami pengkodean halaman, Anda dapat menggunakan trik ini:
sumber
lengthInUtf8Bytes
Fungsi mengembalikan 5 untuk karakter non-BMP sepertistr.length
untuk pengembalian ini 2. Saya akan menulis versi modifikasi dari fungsi ini ke bagian jawaban.encodeURIComponent('🍀')
adalah'%F0%9F%8D%80'
.Tahun-tahun berlalu dan saat ini Anda dapat melakukannya secara native
Perhatikan bahwa itu belum didukung oleh IE (atau Edge) (Anda dapat menggunakan polyfill untuk itu).
Dokumentasi MDN
Spesifikasi standar
sumber
TextEncode
hanya mendukung utf-8 sejak Chrome 53.Berikut adalah versi yang jauh lebih cepat, yang tidak menggunakan ekspresi reguler, atau encodeURIComponent () :
Berikut perbandingan performanya .
Ini hanya menghitung panjang dalam UTF8 dari setiap titik kode unicode yang dikembalikan oleh charCodeAt () (berdasarkan deskripsi wikipedia tentang UTF8 , dan karakter pengganti UTF16).
Ini mengikuti RFC3629 (di mana karakter UTF-8 paling panjang 4-byte).
sumber
Untuk pengkodean UTF-8 sederhana, dengan kompatibilitas yang sedikit lebih baik daripada
TextEncoder
, Blob melakukan triknya. Tidak akan berfungsi di browser yang sangat lama.sumber
Fungsi ini akan mengembalikan ukuran byte dari setiap string UTF-8 yang Anda berikan padanya.
Sumber
sumber
ユーザーコード
panjang dalam byte selalu 21, saya mengujinya pada alat differents; lebih ramah dengan komentar Anda;)Pendekatan lain yang sangat sederhana menggunakan
Buffer
(hanya untuk NodeJS):sumber
Buffer.byteLength(string, 'utf8')
.Butuh beberapa saat bagi saya untuk menemukan solusi untuk React Native jadi saya akan taruh di sini:
Pertama instal
buffer
paketnya:Kemudian gunakan metode node:
sumber
Sebenarnya, saya menemukan apa yang salah. Agar kode berfungsi, halaman
<head>
harus memiliki tag ini:Atau, seperti yang disarankan dalam komentar, jika server mengirimkan
Content-Encoding
header HTTP , seharusnya juga berfungsi.Kemudian hasil dari browser yang berbeda menjadi konsisten.
Berikut ini contohnya:
Catatan: Saya menduga bahwa menentukan pengkodean (akurat) apa pun akan memperbaiki masalah pengkodean. Saya hanya kebetulan membutuhkan UTF-8.
sumber
unescape
JavaScript tidak boleh digunakan untuk mendekode Uniform Resource Identifiers (URI).unescape
memang tidak boleh digunakan untuk mendekode URI. Namun, untuk mengonversi teks ke UTF-8, ini berfungsi dengan baikunescape(encodeURIComponent(...)).length
selalu menghitung panjang yang benar dengan atau tanpameta http-equiv ... utf8
. Tanpa spesifikasi pengkodean beberapa browser mungkin hanya memiliki teks yang berbeda (setelah mengkodekan byte dokumen menjadi teks html sebenarnya) yang panjangnya mereka hitung. Seseorang dapat menguji ini dengan mudah, dengan mencetak tidak hanya panjangnya, tetapi juga teksnya sendiri.Berikut adalah metode independen dan efisien untuk menghitung byte UTF-8 dari sebuah string.
Perhatikan bahwa metode ini dapat memunculkan kesalahan jika string input berformat UCS-2 salah
sumber
Di NodeJS,
Buffer.byteLength
adalah metode yang khusus untuk tujuan ini:Perhatikan bahwa secara default metode ini mengasumsikan string dalam encoding UTF-8. Jika encoding berbeda diperlukan, teruskan sebagai argumen kedua.
sumber
strLengthInBytes
hanya dengan mengetahui 'jumlah' karakter dalam string? misvar text = "Hello World!; var text_length = text.length; // pass text_length as argument to some method?
. Dan, hanya untuk referensi,Buffer
saya baru saja menemukan jawaban ini yang membahasnew Blob(['test string']).size
dan, dalam simpulBuffer.from('test string').length
,. Mungkin ini akan membantu beberapa orang juga?Ini akan bekerja untuk karakter BMP dan SIP / SMP.
sumber
Anda bisa mencoba ini:
Ini bekerja untuk saya.
sumber