2009/12/31

‫استفاده از کدام Encoding برای ذخیره فایل‌ها بهتر است؟

خیلی قدیم‌ها فایل‌های متنی صرفا در قالب اسکی (ANSI) ذخیره می‌شدند. در این قالب به ازای هر نویسه یا کاراکتر دقیقاً یک بایت وجود داشت. علاوه بر این از هیچ (مجموعه) کاراکتری در ابتدای فایل به عنوان header استفاده نمی‌شد. اما حالا با وجود code pageها و یونیکد اوضاع فرق کرده است. حالا باید برای استفاده از هر فایلی، نوع قالب آن مشخص شود تا بتوان با آن کار کرد.

یکی از مشکلاتی که معمولاً برنامه‌نویس‌ها به آن برمی‌خورند این است که اطلاعات یک فایل به فارسی ذخیره شده ولی موقع استفاده به صورت علامت سوال یا دیگر نویسه‌های نامربوط در می‌آید. برای غلبه به این مشکل و دیگر مشکلات مرتبط دانستن بعضی نکات ضروری است. من هر بار که به این طور مشکلات برخورد کرده‌ام سعی کرده‌ام آنها را در جایی یادداشت کنم تا بعداً بتوانم از آنها استفاده کنم. فهرست زیر همان مجموعه یادداشت‌های من راجع به مشکلات Encoding به خصوص در رابطه با برنامه‌نویسی و Visual Studio است.

۱- اگر در Visual Source Safe انکودینگ فایلی عوض شود دیگر قادر به انجام عملیات «مقایسه» نخواهید بود.

۲- کدپیج ۱۲۵۶ ویندوز که عربی است از حروف «ی» و «ک» فارسی پشتیبانی نمی‌کند. و اگر در Visual Studio بخواهید فایلی را که در آن از این حروف استفاده می‌کند ذخیره کنید موفق نمی‌شوید. بلکه مجبور هستید از کدپیج‌های یونیکدی مثل ۶۵۰۰۱ و ۱۲۰۰ و ۱۲۰۱ استفاده کنید.

۳- فایل‌های utf-8 را که notepad ذخیره می‌کند با امضای سه بایتی ذخیره می‌کند و حجم فایل را سه بایت افزایش می‌دهد. ولی در Visual Studio اجازه دارید utf-8 را هم با این امضا و هم بدون آن ذخیره کنید. اگر بدون امضا ذخیره کنید این سه بایت اضافه نمی‌شود.

۴- نمی‌دانم Visual Studio در حالتی که از utf-8 بدون امضا استفاده شده، از کجا می‌فهمد که فایل ما با چه انکودینگی ذخیره شده و چطور باید آن را نشان دهد.

۵- اگر فایلی را با notepad به صورت unicode ذخیره کنید دو بایت به حجم آن اضافه می‌شود. احتمالا این دو بایت به اول فایل به صورت امضا اضافه می‌شود. VS هم دقیقا به همین روش عمل می‌کند.

۶- Unicode و Big Endian Unicode مثل هم هستند به جز یک فرق: ترتیب ذخیره بایت‌ها در آنها فرق دارد. در یکی بایت پر ارزش‌تر در بایت اول و در دیگری در بایت دوم ذخیره می‌شود.

۷- utf-8 یکی از کدپیج‌های رایج است که هر کاراکتر را بسته به شرایط در ۱ الی ۶ بایت نگهداری می‌کند. کاراکترهای معمولی که همان حروف کوچک و بزرگ انگلیسی به علاوه بعضی نشانه‌ها و علامات هستند (همان ASCII معروف) به خاطر سازگاری با برنامه‌های قدیمی و به خاطر کاهش حجم فایل‌های فقط «اسکی» در یک بایت نگهداری می‌شوند. کاراکترهای زبان‌های رایج و معمولی دنیا از جمله عربی و فارسی در ۲ بایت ذخیره می‌شود. کاراکترهای دیگر زبان‌ها از جمله ژاپنی و چینی در ۳ بایت ذخیره می‌شوند و الی آخر. به این ترتیب اگر فایلی فقط حاوی حروف انگلیسی باشد به اندازه تعداد کاراکترهایش حجم دارد و اگر فقط شامل حروف عربی و فارسی باشد دو برابر تعداد کاراکترها حجم خواهد داشت. نام دیگر این استاندارد code-page 65001 است.

۸- نام دیگر یونیکد، کد پیج ۱۲۰۰ و نام دیگر یونیکد (Big-Endian)، کدپیج ۱۲۰۱ است.

۹- یونیکد آن طور که همه تصور می‌کنند که دو بایت است و حداکثر ۶۵۵۳۶ کاراکتر را نگهداری می‌کند نیست بلکه می‌تواند حدود یک میلیون و صد هزار (۱۱۱۴۱۱۲) کاراکتر را ذخیره کند و من قضیه آن را خوب نمی‌فهمم.

۱۰- برای کاربردهای ما همان utf-8 کفایت می‌کند و نیازی نیست به مسائل دیگر فکر کنیم جز این که از signature در ابتدای فایل‌ها استفاده کنیم یا نه. توجه شود که در بیشر محیط‌های لینوکسی از فایل‌ها utf-8 بدون signature استفاده می‌شود و در محیط‌های ویندوزی به طور برعکس عمل می‌شود.

۱۱- اسکی یا ASCII از ۷ بیت و درنتیجه ۱۲۸ کاراکتر تشکیل شده و در محیط‌های متنی کاربرد دارد.

۱۲- امضای سه بایتی اختیاری در ابتدای فایل‌های utf-8: این امضا یک کاراکتر یونیکد به نام Byte Order Mark یا همان BOM است که وقتی به utf-8 تبدیل می‌شود سه کاراکتر جا می‌گیرد. این سه کاراکتر عبارتند از 0xEF,0xBB,0xBF. این کاراکتر را عمدتا برنامه‌های ویندوزی برای تشخیص فایل‌های utf-8 در ابتدای آنها می‌گذارند. شکل نمایشی این سه کاراکتر به شکل  است. نام اصلی آن: )U+FEFF (zero-width no-break space

۱۳- امضای دو بایتی اجباری در ابتدای فایل‌های یونیکد: احتمالا همان امضای کاراکتر BOM است که در utf-8 به صورت ۳ کاراکتر و در یونیکد به صورت ۲ کاراکتر ذخیره می‌شود.

۱۴- نتیجه گیری کلی: چون ما از کاراکترهای غیر انگلیسی و گاها غیر عربی (مثل «ی» فارسی) استفاده می‌کنیم بهتر است از یکی از فرم‌های یونیکد استفاده کنیم. استفاده از utf-8 به خاطر حجم کمتر و سازگاری خوب با کاراکترهای انگلیسی بهتر است. با این که مدل امضا دار با بعضی محیط‌ها و برنامه‌های دیگر خصوصا انواع غیر ویندوزی ناسازگار است ولی اگر سر و کار ما فقط با ویندوز است، بهتر است از مدل امضا دار استفاده کنیم. در غیر این صورت اگر با لینوکس هم سر و کار داریم بهتر است از utf-8 بدون signature استفاده کنیم.

۱۵- یک منبع خوب برای فهمیدن کد یونیکد کاراکترها: fileformat.info

۱۶- یک منبع خوب برای فارسی و یونیکد: فارسی وب

۱۷- نوشته‌های قبلی خودم راجع به یونیکد: پیوند ۱، پیوند ۲.




2009/12/29

آدم‌ها و سازمان‌های مرتبط با پروژه‌های فارسی سازی

مدت‌ها پیش که علاقه‌ام به مسائل فارسی‌سازی خیلی زیاد شد شروع به جمع‌آوری منابعی برای یادگیری بیشتر کردم. حال آنها را به صورت کاملاً خام و دسته‌بندی نشده در اینجا قرار می‌دهم بلکه برای دیگران هم استفاده‌ای داشته باشد.

۱- شرکت فارسی وب شریف: شرکت فارسی‌وب شریف، سهامی خاص در سال ۱۳۸۲ بر پایه گروهی به نام پروژه فارسی‌وب در مرکز محاسبات دانشگاه صنعتی شریف تأسیس شد. فعالیت‌های اصلی این شرکت توزیع و پشتیبانی لینوکس شریف، مشاوره فنی و حقوقی در مورد نرم‌افزارهای آزاد و متن‌باز، و استاندارد کردن مسائل ویژه زبان فارسی در کامپیوتر و فن‌آوری اطلاعات است.

۲- مرکز محاسبات دانشگاه شریف

۳- شورای عالی انفورماتیک: ناشر نسخه نهایی استاندارد یونیکد

۴- شورای عالی اطلاع رسانی

۵- پروژه فارسی وب: پروژه فارسی‌وب یک پروژه تحقیق و توسعه در شرکت فارسی‌وب شریف (و قبل از آن در مرکز محاسبات دانشگاه صنعتی شریف) است. این پروژه نماینده ایران در کنسرسیوم یونی‌کد است و در تعداد زیادی از فعالیت‌های استانداردسازی و توسعه نرم‌افزارهای آزاد فعالیت می‌کند.

۶- مرکز تحقیقات صنایع انفورماتیک: لازم به ذکر است که سابقاً پروژه‌ای برای اضافه کردن امکانات درست مرتب‌سازی فارسی به MySQL از طرف شورای عالی انفورماتیک کشور به مرکز تحقیقات صنایع انفورماتیک سپرده شده بود که متأسفانه شکست خورد.

۷- بهداد اسفهبد: نسخه نهایی استاندارد یونیکد، همکار در شرکت فارسی وب

۸- روزبه پورنادر: نسخه نهایی استاندارد یونیکد

۹- موسسه استاندارد و تحقیقات صنعتی ایران

۱۰- استاندارد یونیکد: استاندارد فناوری اطلاعات - تبادل و شیوه‌ی نمایش اطلاعات فارسی بر اساس یونیکد، کار مشترک شورای عالی انفورماتیک - موسسه استاندارد و تحقیقات صنعتی - تیم دانشگاه شریف در سال ۸۱ منتشر شده است. نام دیگر آن ISIR-6219 است. لینک ۱، لینک ۲، لینک ۳، لینک ۴

۱۱- گروه فارسی در شبکه مرکز محاسبات دانشگاه شریف: نتایج پروژه‌های این گروه (۱۳۷۷ تا ۱۳۸۱) در تهیه استاندارد یونیکد استفاده شده است

۱۲- نظام صنفی رایانه‌ای

۱۳- سازمان مدیریت و برنامه ریزی کشور

۱۴- انجمن شرکت‌های انفورماتیک: منحل شد و به جای آن نظام صنفی رایانه‌ای آمد. ابداع کننده پروتکل ECE هم بود.

۱۵- ISIR-3342: یک کد گذاری قدیمی حروف فارسی

۱۶- بهنام اسفهبد: همکار در شرکت فارسی وب و برخی استانداردهای سازمان استاندارد - استاندارد صفحه کلید ۹۱۴۷

۱۷- بهنام پورنادر: شرکت فارسی وب شریف - همکار در استاندارد ۹۱۴۷ - مهندس صنایع

۱۸- روزبه پورنادر: شرکت فارسی وب شریف - همکار در استاندارد ۹۱۴۷ - عضو فرهنگستان ادب و فارسی، لینک

۱۹- دستور خط فارسی مصوب فرهنگستان زبان و ادب فارسی: استاندارد ۹۱۴۷ با توجه به آن نوشته شده است.

۲۰- استاندارد ۶۲۱۹: همان استاندارد یونیکد است.

۲۱- استاندارد ۹۱۴۷: استاندارد صفحه کلید منتشره در سال ۱۳۸۶، لینک ۱، لینک ۲

۲۲- دکتر یحیی تابش: تاثیرات غیر مستقیم بر پروژه‌های فارسی سازی - عضو فرهنگستان ادب و فارسی، لینک

۲۳- استاندارد ۲۹۰۱: استاندارد صفحه کلید که توسط ۹۱۴۷ باطل اعلام شد.

۲۴- پروژه‌های متن باز فارسی وب: لینک

۲۵- اصل استاندارد فارسی (عربی) در آخرین نسخه یونیکد: لینک

۲۶- سازمان استاندارد: لینک

۲۷- شرکت PIC: لینک

۲۸- احسان اخگری: این آقا مشکل شیف اسپیس صفحه کلید Persian Experimental Keyboard را برطرف کرده و حتی به فارسی وب هم گزارش داده است. لینک

۲۹- فارسی نویسی در ویکی‌پدیا: لینک

۳۰- متنی بسیار خوب درباره مشکل زبان فارسی: لینک

۳۱- اگر شکل ممیز فارسی و ممیز عربی مثل شکل ی عربی و ی فارسی با هم متفاوت چرا مثل حرف «ی» دو کاراکتر جدا در یونیکد برای آنها در نظر گرفته نشده است؟ این قضیه در مورد جدا کننده‌های هزارتایی هم صادق است.

۳۲- تابلوترین مشکل ممیز فارسی در محیط وب (پست ۳): لینک

۳۳- تست زبان فارسی در کامپیوترتان: لینک

۳۴- مشکل نمایش ممیز انگلیسی و اعداد فارسی مثل تاریخ‌ها در IE: مرجع تست زبان فارسی

۳۵- صفحه کلید فارسی: لینک

۳۶- چرا استاندارد معرفی شده در ویستا و در لینوکس با صفحه کلیدهای رایج در کشور یکسان نیست. به مشکل حرف«پ» و«ژ» دقت کنید.

۳۷- این صفحه را در IE و FF ببینید تا متوجه مشکل نمایش ممیز فارسی در IE بشوید: لینک

۳۸- مرکز تحقیقات صنایع انفورماتیک: لینک

۳۹- مناقصات فارسی سازی لینوکس: لینک

۴۰- قبلی: لینک

۴۱- صفحه کلید استاندارد ویندوز که مشکلات برنامه فارسی وب و برنامه احسان اخگری را ندارد: لینک

۴۲- فارسی کننده فایر فاکس: لینک




2009/12/23

تجارب به روز رسانی تکنولوژی‌های دات نت و غیره

درست یک سال پیش در چنین روزی بعد از دریافت مجوز از «رییس»، پروژه مهاجرت از دات‌نت ۲ به ۳٫۵ شروع شد. با آن که همان وقت مطلب کاملی راجع به آن نوشته بودم اما موارد زیر از قلم افتاده بودند. دلیلش هم این بود که ما هم زمان با تغییر دات‌نت فریمورک و ویژوال استودیو، SQL Server را هم از نسخه ۲۰۰۵ به نسخه ۲۰۰۸ ارتقا داده بودیم و مطالب زیر را نمی‌شد در کنار آن بگذارم. با وجود تاخیر یک ساله‌ای که در ارسال این مطلب دارم چون کم کم باید برای دات‌نت ۴ و ویژوال استودیو ۲۰۱۰ حاضر شویم این موارد را در اینجا می‌گذارم تا شاید به درد کسانی که هنوز به دات‌نت ۳٫۵ مهاجرت نکرده‌اند بخورد.

مسائل بعد از به روز رسانی دات‌نت به ۳٫۵ و SQL Server به ۲۰۰۸:

۱ IIS همچنان نسخه ۲ را نشان می‌دهد نه ۳ یا ۳.۵
۲ به روز رسانی framework عمدتا شامل library بوده نه چیز دیگر
۳ نسخه ۳ و ۳.۵ عملا extensionی بر نسخه ۲ هستند و عملا همان نسخه ۲ هستند. ولی نسخه ۴ تغییری اساسی خواهد بود
۴ namespace یک resource و یک dataset عوض شده است
۵ به روز رسانی باعث پاک سازی و مرتب سازی نسخه‌های قبلی پروژه‌ها شد
۶ چطور بفهمم همه چیز واقعا به ۳.۵ تبدیل شده؟ لینک
۷ مشکل virual directory مربوط به reporting services و عدم حضور آن در IIS
۸ تعریف کاربر ASPNET در reporting services
۹ اکتیو ایکس چاپگر در RS 2008 هر دفعه نیاز به نصب دارد
۱۰ حس می‌کنم سرعت بالاتر رفته است
۱۱ در یکی از سیستم‌ها امکان چاپ وجود ندارد با خطای Unable to load printer control... که مربوط به اکتیو ایکس چاپ است
۱۲ مشکلات RS و فونت برنا رایانه (سری بی)




2009/12/22

ارسال ایمیل از دات نت

یکی از مشکلات همیشگی ارسال ایمیل از دات نت کم بودن propertyها کلاس SmtpClient و خلاصه بودن <system.net> در web.config است. تنها چیزهایی که می‌شود به این دو فهماند عبارتند از: نام کاربری، کلمه عبور، شماره پورت‌های مورد نیاز و استفاده یا عدم استفاده از SSL است. اینها در حالی است که اگر ایمیل خوان Outlook Express را مشاهده کنید متوجه می‌شوید که تنظیمات فوق العاده زیادی برای ارسال (و دریافت) ایمیل وجود دارد که شما به طور معمول در دات نت به آن دسترسی ندارید مثل تیک معروف My server requires authentication.

من در جستجو راه حل برای رفع این مشکل به لینک‌های زیر رسیده‌ام که امیدورم بتواند کار شما را هم راه بیندازد:

۱- دات نت برای ارسال ایمیل از CDO استفاده می‌کند. پس دانستن اطلاعاتی راجع به آن کمک خوبی به حل مسئله خواهد کرد: لینک

۲- یک FAQ کامل و بی‌نقص درباره فضای نامی Mail در دات‌نت: لینک

۳- جستجو در گوگل به دنبال آن عملیات خاصی که قصد انجامش با SMTPClient را دارید ولی نمی‌دانید برای آن از چه تنظیماتی باید استفاده کرد: لینک و لینک

۴- همان جستجوی مورد ۳ اما این بار در MSDN: لینک و لینک و لینک

۵- لاگ کردن فعالیت‌های SMTP برای یافتن علت احتمالی خطا: لینک