2008/08/28

‫فونت یونیکد چیست؟

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


۱- سازگار با یونیکد بودن امکان خیلی پیچیده یا جدیدی نیست و قبلا هم فونت‌های زیادی به طور کامل یا با نواقص اندکی این کار را کرده‌اند. البته منظور من (و شورای عالی انفورماتیک و خیلی‌های دیگر) از «سازگاری کامل با یونیکد» سازگاری در حد حروف و علایم فارسی است نه کل حروف و علایم یونیکد چون از معدود فونت‌هایی که این کار را تا اندازه‌ای کرده‌اند فونت آریال مایکروسافت است که عمده کاراکترهای رایج یونیکد در زبان‌های مختلف را با چیزی حدود ۶۵ هزار کاراکتر پیاده سازی کرده است. حجم فایل این فونت بیش از ۲۰ مگابایت می‌باشد.

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

۳- عنوان «سازگار با یونیکد» به دو مفهوم خیلی مهم اشاره دارد:
الف- در محل هر کاراکتری فقط شکل (glyph) خود آن کاراکتر پیاده سازی شده باشد نه کاراکتر دیگری و بالعکس یعنی شکل (glyph) هر کاراکتری صرفا در محل اختصاصی خودش پیاده سازی شده باشد و نه جای دیگری. مثلا در محل U+0041 که مخصوص حرف لاتین A است فقط شکل A قرار دارد نه چیز دیگری. معروف‌ترین فونت‌هایی که این قاعده را رعایت نمی‌کنند فونت‌هایی هستند که در کاربردهای گرافیکی مثل فوتوشاپ به کاربر می‌روند. فونت‌های IPT برنا رایانه از این دست هستند. در مثال حالت بالعکس هم باید گفت کاراکتری مثل «ی» فارسی (ARABIC LETTER FARSI YEH) باید در محل U+06cc پیاده سازی شده باشد و نه جای دیگری. در خیلی از فونت‌های فارسی شکل «ی» فارسی بدون نقطه در محل کاراکتر «ي» عربی نقطه دار (ARABIC LETTER YEH) یعنی U+064a پیاده سازی شده که بسیاری از کاربران را به اشتباه انداخته است. کشف این اشتباه با توجه به اینکه صفحه کلید ویندوزهای قبل از ویستا به طور پیش فرض فقط «ي» عربی نقطه دار را تایپ می‌کنند و بسیاری از فونت‌های رایج هم «ي» عربی را با برداشتن دو نقطه زیر آن نمایش می‌دهند، کار سختی است. کاربران هم وقتی متوجه این موضوع می‌شوند که نوشته‌های خود، که با فونت‌های نیمه استاندارد نوشته‌اند را به سکوی دیگری مثل وب منتقل می‌کنند. فونت‌های سری B برنا رایانه و خیلی فونت‌های رایج دیگر از این دسته هستند. از دیگر سو تعدادی از فونت‌ها هر دو طرف رفت و برگشت قاعده مورد بحث را رعایت کرده‌اند که فونت‌های فارسی وب یکی از آنهاست.
ب- مفهوم دوم عنوان «سازگار با یونیکد» یعنی این که فونت مورد بررسی کاراکترهای محدوده مورد استفاده زبان فارسی را به طور کامل و به شکل صحیح پیاده سازی کرده باشد. به عنوان مثل حروف «گ»، «ژ»، «پ»، «ک» فارسی، «ی» فارسی و صد البته حروف مشترک عربی و فارسی و علایم و کاراکترهای مشترک همه زبان‌ها را. خوشبختانه فونت‌های رایج در این زمینه دچار مشکلات کمتری هستند.

۴- غیر از ایران، کشورها و مناطق دیگری هم از استفاده کنندگان و تولید کنندگان فونت‌های سری عربی (عربی، فارسی، پشتو، کردی و...) به شمار می‌روند از جمله کشورهای عربی و کشورهای حاشیه خلیج فارس، بعضی از همسایه‌های شمالی ایران، پاکستان و... و البته هیچ کدام از این گروه‌ها هم بیکار ننشسته‌اند و برای خط و زبان خود فونت‌های مناسبی پیاده سازی کرده‌اند (یا توسط مراکزی مثل مایکروسافت برایشان پیاده سازی شده). بیشتر این فونت‌ها را می‌توان با تغییرات اندکی به عنوان فونت فارسی هم استفاده کرد. حتی بعضی از آنها را می‌توان مستقیما و بدون هیچ تغییری مورد استفاده قرار دارد. مثل بعضی فونت‌های مجموعه Office مایکروسافت.

۵- سه تا موضوع هست که ربطی به فونت، یونیکد و سازگاری فونت با یونیکد ندارد:
الف- شکل (glyph) یک کاراکتر مجزای از کد آن می‌باشد و نباید این دو را با هم اشتباه گرفت. مبنای ما همیشه کد کاراکترهاست نه شکل آنها.
ب- یونیکد هیچ وابستگی به سیستم عامل، نرم افزار مورد استفاده، محیط اجرا و یا هر چیز دیگر شبیه به این ندارد. چون یک استاندارد کلی و سراسری است.
ج- سازگاری فونت با یونیکد ارتباطی به IME یا Keyboard Layout یا صفحه کلید ندارد. خیلی اوقات با اینکه از یک فونت استاندارد و یونیکد استفاده می‌شود باز هم نمی‌توان بعضی کاراکترها را استفاده کرد. مثلا اگر صفحه کلید ویندوزی (درایور آن نه خود صفحه کلید) استاندارد نباشد، هر چقدر که روی سر «ک» بکوبید باز هم حرف «ك» عربی است که نمایش داده می‌شود نه خود «ک» فارسی.
۶- چطور می‌شود فهمید که یک فونت همه کاراکترهای فارسی (و بعضی حروف خاص عربی مثل «ي» نقطه دار و «ك» بدون سرکش) را به شکل صحیح پیاده سازی کرده یا نه؟ در مورد کاراکترهای مشترک و عمومی که معمولا مشکل خاصی نیست. اما در مورد کاراکترهای خاص و مورد دار از جدول زیر استفاده کنید. این جدول لیستی از کاراکترهای مورد دار را نمایش می‌دهد.
 
نام کاراکتر شکل کاراکتر کد کاراکتر توضیحات
فاصله مجازی ZWNJ 200C همان نیم فاصله معروف
اتصال مجازی ZWJ 200D برای نگه داشتن حروف تنها در حالت کوچک
ویرگول فارسی ، 060C  
نقطه ویرگول فارسی ؛ 061B  
علامت سوال فارسی ؟ 061F  
کشیدگی فارسی ـ 0640  
رقم ۰ تا ۹ فارسی ۰۱۲۳۴۵۶۷۸۹ 06F0-06F9 ارقام فارسی با ارقام عربی یا لاتین فرق دارند.
ممیز فارسی ٫ 066B ممکن است در فونت‌های مختلف اشکال مختلفی به خود بگیرد.
جداکننده هزارهای فارسی ٬ 066c //
درصد فارسی   06AA  
حرف فارسی کاف   06A9  
حرف فارسی ی   06CC  
حرف عربی ك   0643 حتما باید به شکل عربی خودش پیاده سازی شده باشد تا کاربر هیچ وقت اشتباها آنها را به جای معادل فارسی‌شان به کار نبرد.
حرف عربی ي نقطه داری   064A //
حرف عربی ى بدون نقطه   0649 //




2008/08/06

‫پروژه مهاجرت از نسخه بتای ASP AJAX به نسخه فاینال

با وجود آنکه مدت‌هاست ASP AJAX از نسخه‌های CTP، RC و بتا در آمده و حتی در Framework 3.5 با خود دات نت یکی شده است ما هنوز نتوانسته بودیم از نسخه‌های بتا به نسخه نهایی سویچ کنیم.
تنوع شماره نسخه‌های مختلف، ابهام بین File Version و Assembly Version، عوض شدن بعضی Namespaceها، پراکنده شدن فایل‌های مربوطه در سرتاسر کامپیوترها و عملکرد ناشناخته بعضی کنترل‌ها از علل اصلی این تاخیر بزرگ بود. یکی از بدترین معضلاتی که در نتیجه این تاخیر گریبان گیر ما شده بود مشکلات عدیده نصب نرم افزارهای شرکت در محل مشتری‌های جدید بود. سورس‌های اصلی شرکت از نسخه موجود در GAC استفاده می‌کردند و به همین خاطر هیچ نسخه‌ای از فایل‌های Microsoft.Web.Extensions، System.Web.Extensions و AjaxControlToolkit در حین Publish کپی نمی‌شدند و در نتیجه نصاب برنامه‌ها نسخه‌های جداگانه‌ای از این فایل‌ها را تهیه و در سرورها کپی می‌کردند. از آنجا که محل تهیه این فایل‌ها اینترنت یا فلش دیسک نصاب برنامه بود، لزوما با نسخه استفاده شده در سورس شرکت یکی نبوده و باعث به هم ریختگی شدید web.config و عدم کارکرد صحیح برنامه می‌گردید.
هفته پیش فرصتی پیش آمد که چند تا از کامپیوترها را پاکسازی کنم و در حین این پاکسازی‌ها موفق به اجرای پروژه مهاجرت از نسخه‌های موقتی ASP AJAX به نسخه نهایی شدم هرچند که در این بین مجبور شدم چند تا از صفحه‌ها، کنترل‌ها و سرویس‌ها را هم Exclude کنم!
جدول زیر راهنمای خوبی در مورد File & Assembly Version نسخه‌های مربوطه می‌باشد:

نسخه نهایی (Final)

System.Web.Extensions

Assembly Version: 1.0.61025.0

File Version: 1.0.61231.0

AjaxControlToolkit

Assembly Version: 1.0.20229.20821

File Version: 1.0.20229.0

نسخه‌های قبل از نهایی (RC, CTP, Beta)

Microsoft.Web.Extensions

Assembly Version: 1.0.61025.0

File Version: 1.0.61025.61025

AjaxControlToolkit

Assembly Version: 1.0.61106.0

File Version: 1.0.61106.0