پایان کابوس برش متن در جاوا اسکریپت؛ با Intl.Segmenter متن را درست کوتاه کنید
با متد slice در جاوا اسکریپت خداحافظی کنید! یاد بگیرید چگونه با استفاده از Intl.Segmenter متنهای حاوی ایموجی و نویسههای فارسی را بدون شکستگی و به صورت اصولی ک
بسیاری از ما وقتی میخواهیم متن کوتاهی برای بیوگرافی کاربر یا پیشنمایش یک مقاله بنویسیم، بلافاصله به سراغ متد slice در جاوا اسکریپت میرویم. تصور کنید میخواهید متن را در ۳۰ نویسه محدود کنید. کد را مینویسید و همه چیز در ظاهر درست به نظر میرسد، تا زمانی که یک کاربر از ایموجیهای ترکیبی یا نویسههای خاص استفاده کند. در این لحظه، متد قدیمی شما متن را از وسط یک کد یونیکد میبرد و نتیجه چیزی جز یک علامت سوال سیاه یا یک نویسه شکسته نخواهد بود.
دلیل این اتفاق ساده است: متدهای قدیمی جاوا اسکریپت بر اساس واحدهای ۱۶ بیتی (UTF-16) کار میکنند، نه بر اساس آنچه چشم انسان به عنوان یک نویسه واحد میبیند. یک ایموجی ساده ممکن است از چندین واحد کد تشکیل شده باشد و وقتی شما آن را با slice میبرید، در واقع دارید قلب یک نویسه مرکب را میشکافید.
آشنایی با Intl.Segmenter راهکار بومی مرورگرها
خوشبختانه دیگر نیازی به کتابخانههای سنگین برای حل این مشکل نیست. شیء Intl.Segmenter که اکنون در تمام مرورگرهای مدرن پشتیبانی میشود، به شما اجازه میدهد متن را به بخشهای معنادار تقسیم کنید. این ابزار هوشمند میفهمد که یک ایموجی خانواده، با اینکه از چندین کد یونیکد ساخته شده، در واقع یک واحد بصری (Grapheme) است.
وقتی از این ابزار استفاده میکنید، جاوا اسکریپت متن را مانند یک انسان میخواند. این یعنی اگر بگویید ۵ نویسه اول را میخواهم، او دقیقاً ۵ شکل کامل را به شما برمیگرداند، نه ۵ واحد حافظه که ممکن است وسط یک نویسه خاص قطع شوند.
مثالی از دنیای واقعی در وبسایتهای ایرانی
فرض کنید در حال طراحی یک سامانه بومی برای ثبت نام در دورههای آموزشی هستید. کاربر در بخش نام کاربری یا بیوگرافی خود از ترکیب حروف فارسی و ایموجیهای پرچم یا دست استفاده میکند. اگر بخواهید این متن را برای نمایش در یک کارت کوچک با استفاده از متد طول رشته (length) محدود کنید، احتمالاً با به هم ریختگی شدیدی در حروف فارسی چسبان یا حذف نیمی از پرچم مواجه میشوید. با استفاده از Intl.Segmenter، سیستم متوجه مرزهای زبانی و گرافیکی شده و متن را دقیقاً از جایی که معنا تمام میشود، برش میزند.
چگونه از این قابلیت استفاده کنیم؟
برای شروع، ابتدا یک نمونه از این کلاس با تنظیمات دلخواه میسازیم. شما میتوانید مشخص کنید که تقسیمبندی بر اساس نویسه، کلمه یا حتی جمله باشد. برای مشکل رایج ما یعنی کوتاه کردن متن، حالت نویسه (grapheme) بهترین انتخاب است.
پس از ایجاد نمونه، متد segment را روی متن خود اجرا میکنید. این متد یک تکرارکننده (Iterator) برمیگرداند که حاوی اطلاعات دقیقی از هر بخش متن است. با تبدیل این خروجی به یک آرایه، به راحتی میتوانید هر تعداد نویسه که نیاز دارید را جدا کرده و دوباره به هم بچسبانید، بدون اینکه نگران خرابی نویسهها باشید.
فراتر از برش ساده متن
کاربرد Intl.Segmenter فقط به کوتاه کردن متن محدود نمیشود. این ابزار برای تحلیلهای زبانی نیز بسیار کارآمد است. مثلاً اگر بخواهید تعداد کلمات واقعی یک متن فارسی را بشمارید، استفاده از split با فاصله (space) همیشه دقیق نیست، چرا که نیمفاصلهها یا علائم نگارشی محاسبات شما را به هم میزنند. اما این ابزار جدید، با درک قواعد زبانی، کلمات را به درستی تشخیص میدهد.
این قابلیت به خصوص در پروژههایی که با چندین زبان سر و کار دارند، حیاتی است. هر زبان قواعد خاص خود را برای مرز کلمات دارد و Intl.Segmenter با دریافت کد زبان (Locale)، خودش را با آن قوانین تطبیق میدهد.
منبع: dev.to