میکرو وبلاگ

میکرو وبلاگ

آسان

دستورالعمل‌ها

شما شکافی در بازار شبکه‌های اجتماعی برای پست‌های بسیار بسیار کوتاه پیدا کرده‌اید. حالا که Twitter پست‌های ۲۸۰ کاراکتری را مجاز کرده است، به افرادی که دنبال به‌روزرسانی‌های سریع در شبکه‌های اجتماعی هستند خدمتی ارائه نمی‌شود. تصمیم می‌گیرید شبکه‌ی اجتماعی خودتان را بسازید.

برای اینکه محصولتان قابل‌توجه باشد، راه افراط را در پیش می‌گیرید و فقط پست‌های ۵ کاراکتری یا کمتر را مجاز می‌کنید. هر پستی که بیش از ۵ کاراکتر باشد باید به ۵ کاراکتر بریده شود.

برای اینکه کاربرانتان بتوانند خودشان را کامل بیان کنند، ایموجی و دیگر کاراکترهای یونیکد را مجاز می‌کنید.

وظیفه این است که رشته‌های ورودی را به ۵ کاراکتر برش دهید.

کدگذاری متن

متنی که به‌صورت دیجیتال ذخیره می‌شود باید به مجموعه‌ای از بایت‌ها تبدیل شود. سه روش رایج برای نگاشت کاراکترها به بایت وجود دارد.

  • ASCII می‌تواند کاراکترهای زبان انگلیسی را کدگذاری کند. همه‌ی کاراکترها دقیقاً ۱ بایت هستند.
  • UTF-8 یک کدگذاری متن یونیکد است. کاراکترها بین ۱ تا ۴ بایت را اشغال می‌کنند.
  • UTF-16 یک کدگذاری متن یونیکد است. کاراکترها یا ۲ بایت‌اند یا ۴ بایت.

UTF-8 و UTF-16 هر دو کدگذاری‌های یونیکد هستند، یعنی می‌توانند طیف عظیمی از کاراکترها را نمایش دهند، از جمله:

  • متن در بیشتر زبان‌ها و خط‌های جهان
  • متن‌های تاریخی
  • ایموجی

UTF-8 و UTF-16 هر دو کدگذاری‌هایی با طول متغیر هستند، یعنی کاراکترهای مختلف فضای متفاوتی را اشغال می‌کنند.

حرف «a» و ایموجی «😛» را در نظر بگیرید. در UTF-16 حرف ۲ بایت را اشغال می‌کند اما ایموجی ۴ بایت.

نکته‌ی این تمرین استفاده از APIهایی است که حول کاراکترهای یونیکد (کدپوینت‌ها) طراحی شده‌اند، نه حول واحدهای کد یونیکد.

code pointهای یونیکد در برابر code unitها

یک رشته‌ی «معمولی» با رمزگذاری UTF-16 را می‌توان به‌صورت دنباله‌ای از نویسه‌ها نمایش داد که هر نویسه می‌تواند تا ۱۶ بیت طول داشته باشد (نام UTF-16 هم از همین‌جا می‌آید). یعنی حداکثر ۲ به توان ۱۶، یا ۶۵۵۳۶ نویسه‌ی ممکن وجود دارد که می‌توان آن‌ها را با ۱۶ بیت، یا ۱ code unit نمایش داد. این ۶۵۵۳۶ نویسه چیزی را می‌سازند که با نام Basic Multilingual Set شناخته می‌شود و برای رایج‌ترین نویسه‌های بیشتر زبان‌ها به‌اندازه‌ی کافی بزرگ است.

اما برخی نمادها در یک code unit جا نمی‌شوند. راه‌حل این است که آن‌ها را با دو code unit نمایش دهیم. این دو code unit در UTF-16، که اغلب surrogate pair هم نامیده می‌شوند، یک code point می‌سازند.

خلاصه اینکه، وقتی از رمزگذاری UTF-16 صحبت می‌کنیم:

  • یک code unit ۱۶ بیت (یا کمتر) است که یک نویسه را نمایش می‌دهد.
  • یک code point یک یا دو code unit است که یک نویسه را نمایش می‌دهد.

برای اینکه ابهام بیشتر هم بشود، grapheme cluster هم وجود دارد؛ یعنی دنباله‌هایی از نویسه‌های یونیکد (code pointها) که باید به‌عنوان یک واحد بصری در نظر گرفته شوند. برای مثال، بعضی ایموجی‌ها، مثل این یکی 👨‍👦.

UTF-16 در JavaScript

بیشتر متدهای داخلی JavaScript با رشته‌های رمزگذاری‌شده با UTF-16 کار می‌کنند، اما بر پایه‌ی code unitهای UTF-16 کار می‌کنند. برای مثال، متد String.prototype.split("") یک رشته را بر اساس code unitها جدا می‌کند.

از طرف دیگر، String iterators بر اساس code pointها پیمایش می‌کنند.

می‌توانید درباره‌ی رشته‌های یونیکد بسیار بیشتر بخوانید و مثال‌های بیشتری را در MDN پیدا کنید.

ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
JavaScript Exercism

آماده‌اید میکرو وبلاگ را شروع کنید؟

در Exercism ثبت‌نام کنید تا JavaScript را همراه با 37 مفهوم159 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.