WASM adalah mesin virtual tingkat rendah, sehingga harus dapat menangani string yang direpresentasikan sebagai array biner.
Ada metode praktis .fromUTF8 dan .toUTF8: https://github.com/AssemblyScript/assemblyscript/blob/master/std/assembly/string.ts#L499
Namun, mereka tidak simetris dalam tiga cara:
fromUTF8
membutuhkan pengetahuan tentang panjang string, sedangkan toUTF8
tidak mengembalikan nilai tersebut. Anda harus memanggil lengthUTF8
secara terpisah, yang boros (sudah dipanggil toUTF8
)fromUTF8
menangani \0
karakter unicode dalam string dengan benar, sementara toUTF8
memberi kesan bahwa ini tidak didukungfromUTF8
membutuhkan ukuran murni dari string yang dikodekan dalam byte, sedangkan lengthUTF8
mengembalikan ukuran dengan padding nol byte. Bahkan tes yang ada harus menyesuaikannya secara eksplisit: https://github.com/AssemblyScript/assemblyscript/blob/b7e7be20cfe2d35c689d7927ee0e4207a443bb6f/tests/compiler/std/string-utf8.ts#L24Ini adalah pendekatan yang tidak efisien dan membingungkan. Jika tujuan AssemblyScript adalah menjadi bahasa ramah-WASM tingkat tinggi, maka memiliki C-isme di perpustakaan standar seperti pointer telanjang ke string yang diakhiri null terasa seperti bertentangan dengan tujuan tersebut.
Saran saya adalah mengganti nama .lengthUTF8 dan .toUTF8 menjadi .lengthUTF8ZeroTerminated, .toUTF8ZeroTerminated dan memperkenalkan .toUTF8Buffer yang mengembalikan ArrayBuffer yang diisi dengan konten dan ukuran yang benar. API ini akan jauh lebih jelas dan nyaman bagi pengguna.
Solusi alternatif adalah dengan memperkenalkan tipe dasar seperti
class MemSlice {
constructor(readonly offset: usize, readonly length: usize) {}
...
}
yang akan sangat berguna secara umum
Setuju, API ini tidak ideal. Bahkan mungkin masuk akal untuk memindahkannya dari kelas string ke sesuatu yang secara khusus menargetkan interop (dengan C).
Api UTF8/UTF16 ditingkatkan dalam PR ini
Komentar yang paling membantu
Solusi alternatif adalah dengan memperkenalkan tipe dasar seperti
yang akan sangat berguna secara umum