درخواست توضیح و مشکل در unicode

mhabat

Member
با سلام.
می خواستم اگه میشه یه توضیحاتی در مورده unicodeدر سی پلاس پلاس بدین.
منبع فارسی که نیست.
منبع خارجی پیدا کردم اما سردرنیاوردم.
اگه میشه در مورد کد هاش که میگن حدود چند هزارتاس و شامل همه ی کاکرتر ها و کارکتر های فارسی
در سی پلاس پلاس توضیحی بدین.همچنین کد افا 945است اما وقتی با توربو یاdavمیزنم یه کارکتر
عجیبی نمایش میده.
برای نمایس کد های unicodeباید از unsigned charاستفاده کرد؟
اگر میشه در مورد t_charها سر قایلunicodeوثایتunicodeهم توضیحی بدین.
من مثلا اگه متغیر با مقدار 945ازنوع charقرار بدم و بخاوم اونو تا مثلا 980در خروجی چاپ کنه برنامه هنگ
میکنه.(با دوتا کامپایلر هم تست کردم).
خیلی ممنون
بدرود
باتشکر از علی سعید بابت توضیحات عالی شون:ایکس
 

the_king

مدیرکل انجمن
با سلام.
می خواستم اگه میشه یه توضیحاتی در مورده unicodeدر سی پلاس پلاس بدین.
منبع فارسی که نیست.
منبع خارجی پیدا کردم اما سردرنیاوردم.
اگه میشه در مورد کد هاش که میگن حدود چند هزارتاس و شامل همه ی کاکرتر ها و کارکتر های فارسی
در سی پلاس پلاس توضیحی بدین.همچنین کد افا 945است اما وقتی با توربو یاdavمیزنم یه کارکتر
عجیبی نمایش میده.
برای نمایس کد های unicodeباید از unsigned charاستفاده کرد؟
اگر میشه در مورد t_charها سر قایلunicodeوثایتunicodeهم توضیحی بدین.
من مثلا اگه متغیر با مقدار 945ازنوع charقرار بدم و بخاوم اونو تا مثلا 980در خروجی چاپ کنه برنامه هنگ
میکنه.(با دوتا کامپایلر هم تست کردم).
خیلی ممنون
بدرود
باتشکر از علی سعید بابت توضیحات عالی شون:ایکس

کاراکتر های unicode دو بایتی اند، کد کاراکتر شون هم از 0x0000 شروع میشه و به 0xffff ختم میشه،
unicode در اصل فقط یک نوع 16 بیتی نیست، نوع 32 بیتی هم داره، اما در ویندوز مایکروسافت منظور از unicode
معمولا نوع 16 بیتی اش است که ویندوز های مدرن ازش استفاده می کنند و فونت ها باهاش سازگاری دارند.

کاراکتر های ANSI و ASCII یک بایتی اند، کد کاراکتر شون از 0x00 شروع میشه و به 0xff ختم میشه، نوع داده
char برای نمایش کاراکتر های ANSI / ASCII پیش بینی شده.
کاراکتر های UTF-8 طول متغیر دارند، بخشی از کاراکتر ها یک بایتی اند و بقیه دو بایتی. اصولا توابعی که
با UTF-8 کار می کنند پردازش خاصی دارند. مزیت UTF-8 نسبت به Unicode در کاهش فضایی است که برای
نگهداری متن های انگلیسی نیاز دارد.

unsigned یا signed بودن تاثیری روی اندازه حافظه متغیر نداره، روی داده ای هم که داخل متغیر ذخیره شده
هم تاثیری نداره، صرفا نحوه پردازش و محاسبات ریاضی روی اون داده رو تغییر میده.
char یک بایته، به همین جهت چه unsigned باشه و چه نباشه در هر صورت برای نگهداری کاراکتر های
دو بایتی Unicode قابل استفاده نیست. اصولا برای کاراکتر های ANSI و ASCII فرقی نمی کند که unsigned
باشند یا signed چون صرفا مهم است که یک بایت باشند، اما ممکن است بعضی توابع با unsigned بودن
مشکل داشته باشند.

تمامی توابعی هم که با char و *char سر و کار دارند Unicode نیستند و اگر بخواهند رشته های Unicode
را نمایش دهند قاطی می کنند. نمایش رشته های Unicode توابع مخصوص خودش را می خواهد.

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

اصولا برنامه ای که بخواهد از سیستم Unicode استفاده کند کتابخانه wchar.h را include خواهد کرد.
یک نوع داده wchar_t هست که اندازه اش توسط تنظیمات کامپایلر ممکنه تغییر کنه، wchar_t ممکنه یک بایتی
یا دو بایتی یا حتی بزرگتر باشه، اما در محیط هایی که برای ویندوز برنامه می نویسید معمولا wchar_t
بصورت پیشفرض دو بایتی است. طول داده wchar_t در استاندارد ++C مشخص نیست، به همین جهت
خیلی روی دو بایتی بودنش حساب باز نکنید، ممکن است کامپایلری آنرا یک بایتی بداند.

نوع داده char16_t صریحا برای Unicode بکار میره و همیشه دو بایتی است.

اگر برای ویندوز برنامه بنویسید نوع داده WCHAR دو بایتی است و CHAR یک بایتی، اما صریحا ازشان
استفاده نکنید بهتره، اصولا برای مشخص کردن کاراکتر از TCHAR استفاده می کنید که بر اساس تنظیمات
کامپایلر بین CHAR و WCHAR سوئیچ می کند و برنامه نویس درگیر Unicode بودن و نبودن ویندوز نمی شود.
برای مشخص کردن رشته ها هم بجای *char از LPTSTR استفاده میشه که نوع اشاره گر TCHAR است.
 

جدیدترین ارسال ها

بالا