PDA

View Full Version : ورودی یونیکد در سی++ چگونه؟



jirjirakk
جمعه 08 مهر 1384, 09:28 صبح
سوال :
یک برنامه توسط سی پلاس پلاس نوشته شده است (کونسول 32 بیتی) حالا می خوام ورودی اون فارسی باشه و خروجی اون هم فارسی باشه (ترجیحا یونیکد)
از برنامه های فارسی ساز 16 بیتی سپند و غیره هم نمی خوام استفاده بشه می خوام خود برنامه این کار رو انجام بده
اگر این کار امکان پذیره چه جوری ؟

Inprise
شنبه 09 مهر 1384, 15:28 عصر
کدام کامپایلر و کدام محیط ؟

saffari2005
پنج شنبه 14 مهر 1384, 15:27 عصر
سلام آقای اینپرایز!
لطفا این سوال رو برای محیط vc++ 6 توضیح بدین.در ضمن می خواستم بدونم چرا هنوز برخی شرکت ها از vc++ 2005 که به ادعای مایکروسافت به طور کامل یونیکد رو پشتیبانی میکنه استفاده نمی کنند و علتش رو هم باگهای اون می دونن؟ آیا این صحت داره؟

seyedof
جمعه 15 مهر 1384, 02:00 صبح
سلام
والا ما با همون VC6 هم میتونیم یونیکد کار کنیم و مشکلی نداره فکر نکنم vs2005 برای یونیکد لازم باشه. ولی کار کردن با کامپایلری که خودش بتا است و باگ داره کار کاملا غیر منطقی است. چون مثل این میمونه که شما با یک ماشین که مطمئن هستید معیوبه بخواهید برین مسافرت ! همینطوریش هم برنامه هایی که مینویسیم کلی باید دیباگ بشه تا درست کار کنه وای به حال اینکه خدای نکرده خود کمپایلر باگ داشته باشه.
ممنون علی

Inprise
جمعه 15 مهر 1384, 05:29 صبح
محیط VC6 حمایت جالبی از یونیکد نمیکنه ؛ اگر از MFC استفاده میشه باید نگارش سازگار با یونیکدش بصورت مشخص موقع نصب VC منتقل بشه ( بصورت پیش فرض این اتفاق نمیفته ) و اگر از توابع CRT استفاده میشه ، بهتره یا از نگارش مایکروسافتی شون - که معمولا" با یک آندرلاین شروع میشن - استفاده کنی یا ، از ماکروهای مربوطه برای Text Mapping استفاده بشه ؛ و البته خود IDE هم یک برنامهء یونیکد نیست ( یعنی آنچه مینویسی ، روی حافظه و روی دیسک ، نمود یونیکد نداره ) ؛ موارد اول و آخر روی VC .NET حل شده ؛

تا وقتی میخواهی از Win32 API و MFC استفاده کنی ، "مشکل" یونیکد براحتی قابل حله ، اما برای کنسول ، چون نوع پیاده سازی CRT توسط VC قرار نبوده فکری برای یونیکد هم بکنه ، مسئله بسادگی قابل حل نیست . برای خروجی : داده های مورد نظر رو از نوع wchar_t انتخاب کن ، کاراکترست کنسول رو بصورت دستی یا با فراخوانی توابعی نظیر SetConsoleOutputCP به چیزی که MBCS رو بفهمه تغییر بده ( مثلا" 65001 ) و بعد برای C از fwprintf و برای CPP از wcout استفاده کن یا اگر از استریم استفاده میکنی یک w اولش بگذار ؛ برای خروجی و ورودی روی کنسول من ایده ای ندارم و تجربهء موفقی هم نداشته م .

( برای لینوکس : دریافت ورودی و خروجی و پردازش یونیکد یک کاربرد عادی و روزمره است که مدتها پیش مسئله اش حل شده و حتی همین حالا ده ها شل فارسی/عربی به رایگان روی اینترنت در دسترسه و میشه با فراخوانی دو تا تابع ، بین زبانهای مختلف ، در مود کنسول سوئیچ کرد )

موفق باشید

saffari2005
دوشنبه 18 مهر 1384, 16:27 عصر
ممنون :) :)

saffari2005
شنبه 23 مهر 1384, 13:01 عصر
در صورتی که برنامه در vc6 نوشته شده باشه و از قابلیت یونیکد نیز در آن استفاده شده باشد,آیا برای اجرا در os هایی که از یونیکد پشتیبانی نمیکنند (98و 95و me) با مشکل روبرو خواهد شد؟

Inprise
شنبه 23 مهر 1384, 13:05 عصر
برای نگارشهای مذکور - مضاف بر آنچه تا بحال انجام دادی - باید از MSLU هم استفاده کنید ؛

saffari2005
شنبه 23 مهر 1384, 13:07 عصر
اما MSLU طبق گفته مایکروسافت تا این لحظه تنها با vc7 کار میکند.

Inprise
شنبه 23 مهر 1384, 13:23 عصر
رسما" بله ، همراه SDK موجود برای VC7 منتشر شده و ... اما با یک Trick میشه ازش استفاده کرد که قاعدتا" موقعی که جستجو میکردی بهش رسیدی ؛ بهر حال اگر میخواهی درگیر کد نویسی اضافی نشی میتونی از یگ نگارش مستقل و سورس آزاد همین کاربرد استفاده کنی : LibUniCows (http://libunicows.sourceforge.net/)

saffari2005
شنبه 23 مهر 1384, 13:40 عصر
مرسی, مفید بود.