Ikkilik ma'lumot va fayllar

TextDecoder va TextEncoder

Ikkilik ma'lumot bilan ishlaganda tez-tez matnga aylantirish kerak bo'ladi. Masalan, faylni o'qiganingizda baytlar keladi, ularni esa odam o'qiy oladigan satrga o'girish kerak. Buning uchun ikkita o'rnatilgan obyekt bor: TextDecoder (baytlardan matnga) va TextEncoder (matndan baytlarga). Ular Node.js va brauzerda mavjud.

TextDecoder: baytlardan matnga

TextDecoder berilgan bayt ketma-ketligini (buffer yoki TypedArray) satrga o'giradi. Avval dekoder yaratiladi, so'ng decode metodi chaqiriladi:

let decoder = new TextDecoder(kodlash, {options});
let str = decoder.decode(bytesBuffer);

Oddiy misol: baytlarni matnga o'giramiz. "Hi" so'zi ASCII kodlarida 72 (H) va 105 (i):

decoder-oddiy.js
// natija shu yerda chiqadi
decodega Uint8Array, boshqa TypedArray yoki ArrayBufferni berish mumkin. Standart holda kodlash โ€” UTF-8, shuning uchun ko'p hollarda argument yozish shart emas.

UTF-8 va ko'p baytli belgilar

ASCII belgilar (lotin harflari, raqamlar) UTF-8da bitta bayt egallaydi. Lekin boshqa alifbolar โ€” o'zbekcha (kirill), arab, emoji โ€” bir necha bayt egallaydi. Masalan, o'zbekcha kirill harflari odatda 2 baytdan iborat:

decoder-utf8.js
// natija shu yerda chiqadi
Ko'p baytli belgini o'rtasidan bo'lib dekodlash muammo tug'diradi. Agar buferni bo'laklab (masalan tarmoqdan qism-qism kelganda) dekodlasangiz, bir belgining baytlari ikki bo'lakka bo'linib qolishi mumkin. Bunday oqim (streaming) uchun decodega {stream: true} berish kerak โ€” u tugallanmagan baytlarni keyingi chaqiruvgacha saqlab turadi.

Oqimli dekodlash misoli:

decoder-stream.js
// natija shu yerda chiqadi

TextEncoder: matndan baytlarga

TextEncoder teskari ishni bajaradi โ€” satrni UTF-8 baytlariga o'giradi. U doim faqat UTF-8 bilan ishlaydi (boshqa kodlashni qo'llab-quvvatlamaydi), shuning uchun argument olmaydi:

encoder-oddiy.js
// natija shu yerda chiqadi

encode natijasi โ€” Uint8Array. Ko'p baytli belgilar bir nechta bayt beradi, shuning uchun bayt soni belgilar sonidan ko'p bo'lishi mumkin:

encoder-utf8.js
// natija shu yerda chiqadi
TextEncoderda yana encodeInto(str, uint8Array) metodi bor โ€” u yangi massiv yaratmasdan, natijani mavjud Uint8Arrayga to'g'ridan-to'g'ri yozadi. Bu tez-tez kodlash kerak bo'lganda xotira tejaydi.

Aylantirishning to'liq davri

Matnni baytga, so'ng qaytadan matnga o'girib, natija bir xilligiga ishonch hosil qilaylik:

toliq-davr.js
// natija shu yerda chiqadi

Qachon ishlatiladi

TextDecoder/TextEncoder amaliyotda quyidagi holatlarda kerak bo'ladi:

Agar sizda oddiy ASCII matn bo'lsa va tezkorlik muhim bo'lmasa, String.fromCharCode(...bytes) bilan ham ishlash mumkin. Lekin UTF-8 va ko'p tilli matn uchun doim TextDecoder ishlating โ€” u ko'p baytli belgilarni to'g'ri qayta ishlaydi.

Xulosa