لینک کوتاه مطلب : https://hsgar.com/?p=3328

شکستن فرضیات لاتین-1 ما – در تعقیب تنبلی

بنابراین در پست قبلی خود یک فرض خاص (اشتباه) را بررسی کردم که برنامه نویسان تمایل دارند در مورد ماهیت نقاط کد و متن مطرح کنند.

چندین بار از من درباره فرضیاتی که تمایل به انجام آنها داریم پرسیده شد. زیاد هستند. اکثر اسکریپت های مبتنی بر لاتین ساده هستند، اما بیشتر برنامه نویسان وقت خود را صرف پرداختن به متن لاتین می کنند، بنابراین این پیچیدگی ها هرگز مطرح نمی شوند.

فکر کردم مفید باشد که لیست شخصی خود را به اشتراک بگذارم
اسکریپت هایی که فرضیات لاتین-1 ما را می شکند. این فهرستی است که هر زمان که می‌خواهم درباره متن استدلال کنم، از نظر ذهنی آن را بررسی می‌کنم. بررسی می‌کنم که آیا فرضیاتی دارم که در این اسکریپت‌ها شکسته شود یا خیر. اکثر این مفاهیم مستقل از یونیکد هستند. بنابراین هر برنامه ای باید بدون در نظر گرفتن رمزگذاری با این موضوع مقابله کند.

من دوباره توصیه می کنم از طریق آن بروید پست eevee، از آنجایی که بسیاری از موضوعات مرتبط را پوشش می دهد.
عالی-یونیکد همچنین نکات تصادفی زیادی در مورد یونیکد دارد.

به هر حال، این لیست است. توجه داشته باشید که بسیاری از مفاهیم در اینجا در اسکریپت هایی غیر از موارد ذکر شده وجود دارد، اینها فقط اسکریپت ها هستند من برای مقایسه استفاده کنید

عربی / عبری

عربی و عبری هر دو اسکریپت RTL هستند. آنها از راست به چپ می خوانند. این حتی ممکن است بر نحوه چیدمان صفحه تأثیر بگذارد ویکی پدیا عبری.

هر دوی آنها مفهوم حروف را دارند که بسته به جایی که در کلمه هستند، ظاهر آنها را تغییر می دهد. عبری دارای حروف “sofit” است که از نقاط رمز جداگانه استفاده می کند. برای مثال، کاف (כ) باید به صورت ך در انتهای کلمه تایپ شود. یونانی چیزی شبیه به سیگما دارد.

در زبان عربی، حروف می توانند تا چهار شکل مختلف داشته باشند، بسته به اینکه یک کلمه را شروع می کنند، یک کلمه را پایان می دهند، داخل یک کلمه هستند یا خودشان استفاده می شوند. این فرم ها می توانند بسیار متفاوت به نظر برسند. آنها از نقاط کد جداگانه برای این استفاده نمی کنند. با این حال. می توانید لیستی از این فرم ها را مشاهده کنید اینجا

عربی می تواند بسیار مشکل باشد – شخصیت ها باید به هم بپیوندند. و در فونت‌های شکسته (مانند فونت‌های نستعلیق)، پیوندهای پیچیده زیادی دریافت می‌کنید.

همانطور که در آخرین پست اشاره کردم، U+FDFD (﷽)، لیگاتوری که نشان دهنده بسامالا است، نیز شخصیتی است که بسیاری از فرضیات را زیر پا می گذارد.

اسکریپت های هندی

اسکریپت های هندی هستند ابوجیداس، که در آن صامت هایی با اصلاح کننده های مصوت دارید. به عنوان مثال، क “kə” است، که در آن “e” وارونه یک schwa است، چیزی شبیه صدای مصوت “uh”. می‌توانید با اضافه کردن یک دیاکریتیک، مصوت را تغییر دهید (مثلاً ) دریافت چیزهایی مانند का (“kaa”) को (“koh”) कू (“koo”).

همچنین می توانید صامت ها را با هم مخلوط کنید تا خوشه های همخوان ایجاد کنید. “virama” یک نماد واکه کش است که واکه ذاتی schwa را حذف می کند. بنابراین، + تبدیل می شود क्. این صدا به خودی خود غیرقابل تلفظ است زیرا क یک همخوان توقف است (همخوان های با صدادار کشته شده را می توان برای ناز و برخی از صامت های دیگر تلفظ کرد)، اما می توانید آن را با یک صامت دیگر ترکیب کنید. क् + («rə»)، به دست آوردن क्र
(“krə”). صامت‌ها را می‌توان به‌طور بی‌نهایت رشته‌بندی کرد، و بعد از آن می‌توانید یک یا چند علامت مصوت بچسبانید. معمولاً بیش از دو صامت در یک خوشه نمی‌بینید، اما بزرگ‌ترها در سانسکریت (یا هنگام نوشتن برخی از onomatopoeia) غیر معمول نیستند. بسته به فونت ممکن است به صورت حروف تکی رندر نشوند.

یکی از چیزهایی که ظاهر می شود این است که هیچ مفهوم واضحی از یک حرف در اینجا وجود ندارد. مفهومی از “akshara” وجود دارد که اساساً شامل نشانه های مصوت است و بسته به اینکه با چه کسی صحبت می کنید ممکن است شامل خوشه های همخوان نیز باشد. اغلب اشیا بسته به اینکه با یک ویرامای صریح ترسیم شده باشند یا یک گلیف منفرد را تشکیل می دهند، خوشه های akshara هستند.

به طور کلی ماهیت virama به عنوان یک شخصیت ترکیبی دو طرفه در یونیکد بسیار جدید است.

هانگول

کره ای کار سرگرم کننده خود را در مورد به هم پیوستن شخصیت ها انجام می دهد. هانگول مفهومی از “بلوک هجا” دارد که در اصل یک حرف است. از یک صامت پیشرو، مصوت میانی و یک همخوان دم اختیاری تشکیل شده است. 각 نمونه ای از این بلوک هجا است و می توان آن را به صورت ᄀ + ᅡ + ᆨ تایپ کرد. همچنین می توان آن را به صورت 각 تایپ کرد که یک “فرم از پیش ترکیب شده” (و یک نقطه کد واحد) است.

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

همانطور که در پست قبلی‌ام اشاره کردم، بلوک‌های ظاهراً هجا با L، V و T (مجاور) بیشتر نیز در زبان کره‌ای قدیمی معتبر هستند و استفاده می‌شوند، بنابراین الگوریتم تقسیم‌بندی نمودار در یونیکد «ᄀᄀᄀ각ᆨᆨ» را یک تک نمودار (به صراحت به این موضوع اشاره می کند). من از هیچ فونتی اطلاع ندارم که اینها را به صورت یک بلوک تک هجا نشان دهد، یا اینکه حتی یک کار معتبر است.

اسکریپت های هان

بنابراین چینی (هانزی)، ژاپنی (کانجی، کره ای (Hanjaو ویتنامی (Hán tự، همراه با Chữ Nôm ) همه حروف های مشترک را به اشتراک می گذارند که در مجموع «شخصیت های هان» (یا کاراکترهای CJK) نامیده می شوند). این زبان‌ها در مقطعی از تاریخ خود سیستم نوشتاری چینی را به عاریت گرفتند و تغییرات خود را در آن ایجاد کردند تا متناسب با نیازهای خود باشند.

در حال حاضر، شخصیت های هان ایدئوگراف هستند. این یک خط آوایی نیست. شخصیت های فردی کلمات را نشان می دهند. کلمه/ایده ای که آنها نشان می دهند همیشه در بین زبان ها سازگار نیست. تلفظ معمولاً نیز متفاوت است. گاهی اوقات، گلیف بر اساس زبان مورد استفاده کمی متفاوت ترسیم می شود. در حال حاضر حدود 80000 ایدئوگرافی هان در یونیکد وجود دارد.

خود مفهوم ایدئوگراف ها برخی از مفروضات لاتین-1 ما را می شکند. به عنوان مثال، چگونه فاصله ویرایش Levenshtein را برای متن با استفاده از ایدئوگرافیک هان تعریف می کنید؟ پاسخ مستقیم این است که شما نمی توانید، هر چند اگر عقب نشینی کنید و تصمیم بگیرید چرا شما نیاز به فاصله ویرایش دارید، شاید بتوانید راه حلی پیدا کنید. برای مثال، اگر برای تشخیص اشتباهات املایی به آن نیاز دارید، روش ورودی کاربر ممکن است کمک کند. اگر بر اساس پینیین یا بوپوموفو باشد، ممکن است بتوانید به اسکریپت آوایی معکوس تبدیل کنید، فاصله ویرایش را در آن فضا اعمال کنید و دوباره تبدیل کنید. یا نه. من فقط در این اسکریپت ها یک کنجکاوی بیهوده را حفظ می کنم و در واقع از آنها استفاده نمی کنم، بنابراین مطمئن نیستم که چقدر خوب کار می کند.

مفهوم کاراکتر نیم عرض یک چیز عجیبی است که برخی از فرضیات را می شکند.

در فضای یونیکد به طور خاص، همه این اسکریپت ها توسط یک مجموعه ایدئوگراف نشان داده می شوند. این به “اتحاد هان” معروف است. این یک موضوع بسیار بحث برانگیز است، اما نتیجه نهایی این است که گاهی اوقات ممکن است رندر کردن به زبان متن بستگی داشته باشد، به عنوان مثال در HTML شما با یک <span lang=whatever>. صفحه ویکی چند نمونه از کاراکترهای وابسته به رمزگذاری دارد.

یونیکد همچنین دارای مفهوم انتخابگر تنوع است، که یک نقطه کد است که می تواند برای انتخاب بین تغییرات برای یک نقطه کد که راه های متعددی برای ترسیم دارد، استفاده شود. اینها در اسکریپت های هان استفاده می شوند.

در حالی که این بر رندر، یونیکد، به عنوان سیستمی برای توصیف می کند متن، همچنین دارای مفهومی از کاراکترهای حاشیه نویسی بین خطی است. اینها برای نشان دادن استفاده می شوند
فوریگانا / یاقوت سرخ. فونت ها این را ارائه نمی کنند، اما اگر می خواهید متنی را نشان دهید که از یاقوت استفاده می کند مفید است. به طور مشابه، وجود دارد توالی توصیف ایدئوگرافیک که می تواند برای “ساخت” گلیف از موارد کوچکتر استفاده شود، زمانی که حروف را نمی توان در یونیکد کدگذاری کرد. اینها نیز نباید رندر شوند، اما می‌توانند برای توصیف وجود شخصیتی مانند biáng. اینها چیزهایی نیستند که یک برنامه نویس باید نگران آنها باشد. من فقط آنها را جالب می دانم و نتوانستم از ذکر آنها خودداری کنم 🙂

سخنرانان ژاپنی به طور کامل به یونیکد منتقل نشده اند. چیزهای زیادی با استفاده از Shift-JIS وجود دارد، و IIRC دلایل معتبری برای آن وجود دارد (شاید وحدت هان؟). این یکی دیگر از مواردی است که باید در نظر بگیرید.

در نهایت، این اسکریپت ها اغلب نوشته می شوند به صورت عمودی، بالا پایین. مغولی، در حالی که اسکریپت هان نیست، به صورت عمودی به پهلو نوشته شده است، که بسیار منحصر به فرد است. CSS حالت های نوشتن spec مفاهیم مختلفی را در رابطه با این موضوع معرفی می کند، هرچند که بیشتر در زمینه وب است.

تایلندی / خمر / برمه / لائوس

این اسکریپت ها از فاصله برای تقسیم کلمات استفاده نمی کنند. درعوض، آنها قوانینی برای شروع و پایان کاراکترهای یک کلمه دارند. این را می توان به صورت برنامه نویسی تعیین کرد، با این حال IIRC مشخصات Unicode تلاشی برای مقابله با این موضوع ندارد. کتابخانه‌هایی وجود دارد که می‌توانید در اینجا از آنها استفاده کنید.

خود خط های لاتین!

ترکی یک خط لاتین است. اما یک چیز عجیبی دارد: حروف بزرگ «i» یک «İ» نقطه‌دار و حروف کوچک «I» «ı» است. اگر عملیات مبتنی بر Case را انجام می دهید، سعی کنید از یک کتابخانه آگاه از Unicode استفاده کنید و در صورت امکان، محلی را ارائه دهید.

همچنین، همه نقاط کد دارای نسخه تک کد با حروف بزرگ نیستند. eszett (ß) با حروف بزرگ به “SS” می گویند. همچنین “سرمایه” eszett ẞ وجود دارد، اما به نظر می رسد استفاده از آن متفاوت است و من دقیقاً مطمئن نیستم که چگونه در اینجا تعامل دارد.

در حالی که Latin-1 از کاراکترهای از پیش ساخته شده استفاده می کند، یونیکد همچنین راه هایی را برای تعیین همان کاراکترها از طریق ترکیب نشانه ها معرفی می کند. درمان اینها به همین صورت مستلزم استفاده از الگوریتم های عادی سازی (NFC/NFD) است.

ایموجی

خوب، فیلمنامه نیست. اما ایموجی به اندازه کافی عجیب است که بسیاری از فرضیات ما را زیر پا می گذارد. اسکریپت های بالا اکثر این موارد را پوشش می دهند، اما گاهی اوقات فکر کردن به آنها در زمینه شکلک آسان تر است.

نکته اصلی در مورد ایموجی این است که می توانید از یک کاراکتر با عرض صفر برای چسباندن ایموجی ها به هم استفاده کنید.

برای مثال، ایموجی خانوادگی 👩‍👩‍👧‍👦 (ممکن است برای شما رندر نباشد) با استفاده از ایموجی زن/مرد/دختر/پسر و چسباندن آن‌ها با ZWJ ساخته می‌شود. شما می توانید تجزیه آن را در uniview.

دنباله های بیشتری مانند این وجود دارد که می توانید آنها را در قسمت مشاهده کنید emoji-zwj-sequences فایل. به عنوان مثال، MAN + ZWJ + COOK یک شکلک آشپز مرد می دهد (پشتیبانی از فونت ناقص است). به طور مشابه، SWIMMER + ZWJ + FEMALE SIGN یک شناگر زن است. شما هر دو دنباله از فرم “شخص جنسیتی + zwj + چیز” و “ایموجی حاوی انسان + zwj + جنسیت”، IIRC را به دلیل مشکلات قدیمی دارید

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

در نهایت، ایموجی پرچم، دانه های برف بسیار خاصی هستند. مثلا 🇪🇸 پرچم اسپانیاست. تشکیل شده از دو کاراکتر نشانگر منطقه ای برای “E” و “S”.

یونیکد نمی‌خواست هر بار که کشور یا قلمرو جدیدی ظاهر می‌شود، پرچم‌های جدیدی اضافه کند. آنها همچنین نمی خواستند وارد کار دشوار تعیین کشور شوند استبه عنوان مثال هنگام برخورد با مناطق مورد مناقشه. بنابراین در عوض، آنها فقط این نمادهای شاخص منطقه ای را تعریف کردند. فونت ها قرار است جفت نمادهای RI را بگیرند و کد کشور را به یک پرچم نگاشت کنید. این نقشه برداری به آنها بستگی دارد، بنابراین برای فونتی که یک جفت نشانگر منطقه ای “E” + “S” را به عنوان چیزی غیر از پرچم اسپانیا ارائه دهد کاملاً معتبر است. برای مثال، در برخی از سیستم‌های چینی، پرچم تایوان (🇹🇼) ممکن است نمایش داده نشود.


من به شدت توصیه می کنم دفعه بعد که در حال نوشتن کدی هستید که رشته های ارائه شده توسط کاربر را دستکاری شدید انجام می دهد، با این لیست نسبتاً کوچک از اسکریپت ها مقایسه کنید.



لینک منبع

ارسال یک پاسخ

آدرس ایمیل شما منتشر نخواهد شد.