مقدمه

رشته‌ها در جاوااسکریپت برای نمایش متن به کار می‌روند، اما در دنیای کامپیوتر، متن در نهایت به صورت دنباله‌ای از بایت‌های باینری ذخیره و منتقل می‌شود. Encoding API یک رابط برنامه‌نویسی استاندارد برای تبدیل بین رشته‌های متنی و داده‌های باینری (به طور خاص، آرایه‌های Uint8Array) فراهم می‌کند. این API زمانی حیاتی است که نیاز به کار با فایل‌ها، درخواست‌های شبکه، یا الگوریتم‌های رمزنگاری داریم که با داده‌های خام باینری سروکار دارند.

این API بر اساس مفهوم «انکودینگ کاراکتر» کار می‌کند که معروف‌ترین و پراستفاده‌ترین آن در وب، UTF-8 است. Encoding API شامل دو رابط اصلی است: TextEncoder برای تبدیل رشته به بایت، و TextDecoder برای تبدیل بایت به رشته.

رمزگذاری رشته‌ها با TextEncoder

یک نمونه (instance) از TextEncoder همیشه رشته‌ها را به فرمت UTF-8 انکود می‌کند. فرآیند کار با آن بسیار ساده است: ابتدا یک نمونه از آن را با new TextEncoder() می‌سازیم و سپس متد encode() آن را برای تبدیل رشته به یک آرایه از بایت‌ها (Uint8Array) فراخوانی می‌کنیم.

Copy Icon JAVASCRIPT
// 1. Create a TextEncoder instance
const encoder = new TextEncoder();

const greeting = 'سلام دنیا! 👋';

// 2. Encode the string into a Uint8Array of UTF-8 bytes
const utf8Bytes = encoder.encode(greeting);

console.log(utf8Bytes);
// Expected output: Uint8Array(18) [216, 179, 217, 132, ...]

console.log(`The string "${greeting}" is ${utf8Bytes.length} bytes long in UTF-8.`);

در کد بالا، ما یک رشته حاوی کاراکترهای فارسی و یک اموجی را به متد encode() می‌دهیم. خروجی یک Uint8Array است که نمایش باینری آن رشته در انکودینگ UTF-8 است. همانطور که می‌بینید، کاراکترهای غیر-ASCII مانند حروف فارسی یا اموجی‌ها، بیش از یک بایت فضا اشغال می‌کنند.

رمزگشایی بایت‌ها با TextDecoder

TextDecoder عمل معکوس را انجام می‌دهد: یک دنباله از بایت‌ها (مانند یک Uint8Array) را گرفته و آن را به یک رشته جاوااسکریپت قابل خواندن تبدیل می‌کند. هنگام ساخت یک نمونه از TextDecoder، می‌توانیم انکودینگ مورد نظر را مشخص کنیم، اما اگر این کار را نکنیم، به طور پیش‌فرض از UTF-8 استفاده خواهد کرد که در اکثر مواقع همان چیزی است که نیاز داریم.

Copy Icon JAVASCRIPT
// Assuming 'utf8Bytes' is the Uint8Array from the previous example

// 1. Create a TextDecoder instance (defaults to 'utf-8')
const decoder = new TextDecoder();

// 2. Decode the byte array back into a string
const decodedString = decoder.decode(utf8Bytes);

console.log(decodedString); // "سلام دنیا! 👋"

این کد به سادگی آرایه بایتی که در مرحله قبل ایجاد کردیم را به متد decode() می‌دهد و رشته اصلی را دوباره به دست می‌آورد. این فرآیند برای خواندن داده‌های باینری از فایل‌ها یا پاسخ‌های شبکه بسیار حیاتی است.

یک مثال کاربردی

گرچه بسیاری از APIهای مدرن وب (مانند Fetch API) می‌توانند به صورت خودکار تبدیل رشته و داده باینری را مدیریت کنند، اما Encoding API ابزار پایه‌ای این عملیات است و زمانی که به کنترل مستقیم بر روی داده‌های باینری نیاز داریم، به کار می‌آید. برای مثال، فرض کنید می‌خواهیم متنی را برای ذخیره در یک فایل آماده کنیم.

Copy Icon JAVASCRIPT
async function prepareTextForSaving(text) {
    const encoder = new TextEncoder();
    const data = encoder.encode(text);
    
    // In a real-world scenario, you would pass this 'data' (Uint8Array)
    // to a file-writing API like the File System Access API.
    console.log('Binary data is ready to be written to a file.');
    return data;
}

prepareTextForSaving('This is my file content.');

این تابع یک رشته را گرفته و آن را به فرمت باینری Uint8Array تبدیل می‌کند. این خروجی باینری، فرمت استاندارد مورد نیاز برای بسیاری از APIهایی است که با فایل‌ها یا جریان‌های داده (streams) کار می‌کنند.

در این درس با Encoding API و دو جزء اصلی آن یعنی TextEncoder و TextDecoder آشنا شدیم و دیدیم که چگونه این ابزارها به عنوان پل ارتباطی بین دنیای متنی جاوااسکریپت و دنیای باینری فایل‌ها و شبکه‌ها عمل می‌کنند. این یک مهارت بنیادی برای کار با داده‌های سطح پایین است. در درس بعدی، این مفهوم را با بررسی `APIهای Blob و File` گسترش خواهیم داد و یاد می‌گیریم که چگونه با اشیاء داده‌ی بزرگ و فایل‌ها در جاوااسکریپت کار کنیم.