شما شکافی در بازار شبکههای اجتماعی برای پستهای بسیار بسیار کوتاه پیدا کردهاید. حالا که Twitter پستهای ۲۸۰ کاراکتری را مجاز کرده است، به افرادی که دنبال بهروزرسانیهای سریع در شبکههای اجتماعی هستند خدمتی ارائه نمیشود. تصمیم میگیرید شبکهی اجتماعی خودتان را بسازید.
برای اینکه محصولتان قابلتوجه باشد، راه افراط را در پیش میگیرید و فقط پستهای ۵ کاراکتری یا کمتر را مجاز میکنید. هر پستی که بیش از ۵ کاراکتر باشد باید به ۵ کاراکتر بریده شود.
برای اینکه کاربرانتان بتوانند خودشان را کامل بیان کنند، ایموجی و دیگر کاراکترهای یونیکد را مجاز میکنید.
وظیفه این است که رشتههای ورودی را به ۵ کاراکتر برش دهید.
متنی که بهصورت دیجیتال ذخیره میشود باید به مجموعهای از بایتها تبدیل شود. سه روش رایج برای نگاشت کاراکترها به بایت وجود دارد.
UTF-8 و UTF-16 هر دو کدگذاریهای یونیکد هستند، یعنی میتوانند طیف عظیمی از کاراکترها را نمایش دهند، از جمله:
UTF-8 و UTF-16 هر دو کدگذاریهایی با طول متغیر هستند، یعنی کاراکترهای مختلف فضای متفاوتی را اشغال میکنند.
حرف «a» و ایموجی «😛» را در نظر بگیرید. در UTF-16 حرف ۲ بایت را اشغال میکند اما ایموجی ۴ بایت.
نکتهی این تمرین استفاده از APIهایی است که حول کاراکترهای یونیکد (کدپوینتها) طراحی شدهاند، نه حول واحدهای کد یونیکد.
یک رشتهی «معمولی» با رمزگذاری 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ها) که باید بهعنوان یک واحد بصری در نظر گرفته شوند. برای مثال، بعضی ایموجیها، مثل این یکی 👨👦.
بیشتر متدهای داخلی JavaScript با رشتههای رمزگذاریشده با UTF-16 کار میکنند، اما بر پایهی code unitهای UTF-16 کار میکنند.
برای مثال، متد String.prototype.split("") یک رشته را بر اساس code unitها جدا میکند.
از طرف دیگر، String iterators بر اساس code pointها پیمایش میکنند.
میتوانید دربارهی رشتههای یونیکد بسیار بیشتر بخوانید و مثالهای بیشتری را در MDN پیدا کنید.
در Exercism ثبتنام کنید تا JavaScript را همراه با 37 مفهوم159 تمرین و مربیگری انسانی واقعی یاد بگیرید و در آن استاد شوید، همهی اینها رایگان.