Saya memiliki beberapa data yang dikodekan UTF-8 yang hidup dalam berbagai elemen Uint8Array dalam Javascript. Apakah ada cara yang efisien untuk memecahkan kode ini ke string javascript biasa (saya yakin Javascript menggunakan Unicode 16 bit)? Saya tidak ingin menambahkan satu karakter pada saat itu karena rangkaian string akan menjadi intensif CPU.
javascript
Jack Wester
sumber
sumber
u8array.toString()
saat membaca file dari BrowserFS yang mengekspos objek Uint8Array saat Anda memanggilfs.readFile
.toString
padaUint8Array
pengembalian nomor dipisahkan koma seperti"91,50,48,49,57,45"
(Chrome 79)Jawaban:
TextEncoder
danTextDecoder
dari standar Encoding , yang di-polyfill oleh pustaka stringencoding , mengkonversi antara string dan ArrayBuffers:sumber
npm install text-encoding
,,var textEncoding = require('text-encoding'); var TextDecoder = textEncoding.TextDecoder;
. Tidak, terima kasih.utf-8
. Jadi,TextEncoder
argumennya tidak perlu!TextEncoder
/TextDecoder
API di v11, jadi tidak perlu menginstal paket tambahan jika Anda hanya menargetkan versi Node saat ini.Ini harus bekerja:
Ini agak lebih bersih sebagai solusi lain karena tidak menggunakan peretasan atau bergantung pada fungsi JS Browser, misalnya berfungsi juga di lingkungan JS lainnya.
Lihat demo JSFiddle .
Lihat juga pertanyaan terkait: di sini dan di sini
sumber
fromUTF8Array([240,159,154,133])
ternyata kosong (sementarafromUTF8Array([226,152,131])→"☃"
)Inilah yang saya gunakan:
sumber
RangeError
teks yang lebih besar. "Ukuran tumpukan panggilan maksimum terlampaui"SCRIPT28: Out of stack space
ketika saya memberinya 300 + k karakter, atauRangeError
untuk Chrome 39. Firefox 33 baik-baik saja. 100 + k berjalan baik dengan ketiganya.Ditemukan di salah satu aplikasi sampel Chrome, meskipun ini dimaksudkan untuk blok data yang lebih besar di mana Anda setuju dengan konversi asinkron.
sumber
Dalam Node "
Buffer
instance jugaUint8Array
instance ", jadibuf.toString()
berfungsi dalam kasus ini.sumber
Buffer
juga Uint8Array. Terima kasih!Buffer.from(uint8array).toString('utf-8')
Solusi yang diberikan oleh Albert berfungsi dengan baik selama fungsi yang disediakan jarang dipanggil dan hanya digunakan untuk array berukuran sedang, jika tidak maka akan sangat tidak efisien. Berikut adalah solusi JavaScript vanilla yang disempurnakan yang berfungsi untuk Node dan browser serta memiliki keuntungan sebagai berikut:
• Bekerja secara efisien untuk semua ukuran array oktet
• Tidak menghasilkan string buang perantara
• Mendukung karakter 4-byte pada mesin JS modern (jika tidak, "?" Diganti)
sumber
Lakukan apa yang dikatakan @Sudhir, dan kemudian untuk mengeluarkan String dari daftar angka yang dipisahkan koma, gunakan:
Ini akan memberi Anda string yang Anda inginkan, jika masih relevan
sumber
String.fromCharCode.apply(null, unitArr);
. Seperti yang disebutkan, ini tidak menangani pengkodean UTF8, tetapi terkadang ini cukup sederhana jika Anda hanya memerlukan dukungan ASCII tetapi tidak memiliki akses ke TextEncoder / TextDecoder.Jika Anda tidak dapat menggunakan TextDecoder API karena tidak didukung di IE :
sumber
Coba fungsi ini,
sumber: https://gist.github.com/tomfa/706d10fed78c497731ac , pujian untuk Tomfa
sumber
Saya frustrasi melihat bahwa orang tidak menunjukkan cara melakukan dua arah atau menunjukkan bahwa segala sesuatunya berfungsi pada string UTF8 yang tidak sepele. Saya menemukan posting di codereview.stackexchange.com yang memiliki beberapa kode yang berfungsi dengan baik. Saya menggunakannya untuk mengubah rune kuno menjadi byte, untuk menguji beberapa crypo pada byte, lalu mengubahnya kembali menjadi string. Kode yang berfungsi ada di github di sini . Saya mengganti nama metode untuk kejelasan:
Pengujian unit menggunakan string UTF-8 ini:
Perhatikan bahwa panjang string hanya 117 karakter tetapi panjang byte, saat dikodekan, adalah 234.
Jika saya menghapus komentar baris console.log, saya dapat melihat bahwa string yang didekodekan adalah string yang sama yang dikodekan (dengan byte yang melewati algoritme berbagi rahasia Shamir!):
sumber
String.fromCharCode.apply(null, chars)
akan error jikachars
terlalu besar.But beware: by using apply this way, you run the risk of exceeding the JavaScript engine's argument length limit. The consequences of applying a function with too many arguments (that is, more than tens of thousands of arguments) varies across engines. (The JavaScriptCore engine has hard-coded argument limit of 65536.
Di NodeJS, kami memiliki Buffer yang tersedia, dan konversi string dengannya sangat mudah. Lebih baik, mudah untuk mengubah Uint8Array menjadi Buffer. Coba kode ini, ini berfungsi untuk saya di Node untuk pada dasarnya setiap konversi yang melibatkan Uint8Arrays:
Kami baru saja mengekstrak ArrayBuffer dari Uint8Array dan kemudian mengubahnya menjadi Buffer NodeJS yang tepat. Kemudian kami mengonversi Buffer menjadi string (Anda dapat memasukkan pengkodean hex atau base64 jika Anda mau).
Jika kami ingin mengonversi kembali ke Uint8Array dari string, maka kami akan melakukan ini:
Ketahuilah bahwa jika Anda mendeklarasikan pengkodean seperti base64 saat mengonversi ke string, Anda harus menggunakan
Buffer.from(str, "base64")
jika Anda menggunakan base64, atau pengkodean lain apa pun yang Anda gunakan.Ini tidak akan berfungsi di browser tanpa modul! Buffer NodeJS tidak ada di browser, jadi metode ini tidak akan berfungsi kecuali Anda menambahkan fungsionalitas Buffer ke browser. Itu sebenarnya cukup mudah dilakukan, cukup gunakan modul seperti ini , yang kecil dan cepat!
sumber
`
sumber
Saya menggunakan cuplikan Ketikan ini:
Hapus anotasi jenis jika Anda memerlukan versi JavaScript. Semoga ini membantu!
sumber