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);
kodlashโ kodlash turi, standarti"utf-8"(eng keng tarqalgan);optionsโ ixtiyoriy obyekt; masalan{fatal: true}โ noto'g'ri baytlarda xatolik tashlash,{ignoreBOM: true}.
Oddiy misol: baytlarni matnga o'giramiz. "Hi" so'zi ASCII kodlarida 72 (H) va 105 (i):
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:
decodega {stream: true} berish kerak โ u tugallanmagan baytlarni keyingi chaqiruvgacha saqlab turadi.Oqimli dekodlash misoli:
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:
encode natijasi โ Uint8Array. Ko'p baytli belgilar bir nechta bayt beradi, shuning uchun bayt soni belgilar sonidan ko'p bo'lishi mumkin:
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:
Qachon ishlatiladi
TextDecoder/TextEncoder amaliyotda quyidagi holatlarda kerak bo'ladi:
- Fayl o'qish:
ArrayBufferko'rinishida kelgan matnli faylni satrga o'girish; - Tarmoq:
fetchorqali kelgan ikkilik javobni matnga aylantirish; - WebSocket: ikkilik xabarlarni o'qish;
- Kriptografiya: matnni baytga o'girib, hash yoki shifrlashga uzatish;
- Fayl formatlari: sarlavha (header)dan matnli qismlarni ajratib olish.
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
TextDecoderโ baytlarni (Uint8Array/ArrayBuffer) satrga o'giradi;TextEncoderโ satrni UTF-8 baytlariga (Uint8Array) o'giradi;- Standart kodlash โ UTF-8; TextEncoder faqat UTF-8 bilan ishlaydi;
- Ko'p baytli belgilar bir nechta bayt egallaydi โ bayt soni belgi soniga teng emas;
- Oqimli (bo'laklab kelgan) ma'lumot uchun
decode(..., {stream: true})ishlating; - Ular Node.js va brauzerda mavjud โ fayl, tarmoq va kriptografiyada ko'p qo'llaniladi.