PDA

View Full Version : معرفي توابع + مثال + نكات



kitten
پنج شنبه 01 مرداد 1388, 19:51 عصر
سلام دوستان
اميدوارم حالتون خوب باشه ، گفتم تا هنوز مسافرت نرفتم تاپيك را بزنم كه بعدا نگند فقط نظر سنجي گذاشت و رفت پيداش نشد
خوب براي شروع فصل دوم كتاب
Programming Windows / Charles Petzold. -- 5th ed.
را براتون ترجمه كردم و مي زارمش كه بخونيد، اميدوارم كه خوشتون بياد ، بيشترش تاريخچه است اما هر چي به اخر فصل مي رسيم مطالب جالبتر و مهمتر مي شه پس پيشنهاد مي كنم كه بخونيدش
خوب حالا دليلشم بهتون مي گم :
1.اولا بدك نيست كه ما يه سري اطلاعات در مورد سيستم هاي رمزنگاري يونيكد و اسكي و ... داشته باشيم
2. كارمون را در معرفي توابع راحت تر مي كنه و راحت تر مي تونيم مثال بزنيم، براي مثال مي گم كه در سر فايل String.h ما تابع strcpy() را داريم كه همگش مي شناسيدش اما حالا تابع wcscpy() را هم داريم كه براي كاراكتر هاي عريض هستش ، اما تا تفاوت كاراكتر هاي عريض و ... را ندونيم كه نمي تونيم از ان استفاده كنيم ، پس به نظرم مفيد امد
ضمنا من متن زبان اصلي را هم مي گذارم ، آخه شايد بعضي جاها را خوب ترجمه نكرده باشم و ديگه اين كه ترجمه كامل نيست بعضي جا ها را بر حسب نياز كم و زياد كردم اخه كتاب خيلي قديمي است اما مطالب خوبي داره!
فقط اگه خواستيد زبان اصلي را بخونيد صفحات اخر فصل را نخونيد اخه در مورد برنامه نويسي Win32 هستش!
معرفي يونيكد:
به صورت خيلي ساد يونيكد (Unicode) توسعه سيستم رمزگزاري اسكي(ASCII-به پاورقي 1 برويد)است. و نه تنها براي نمايش هر كاراكتر در سيستم اصكي كه از 7 بيت استفاده مي شود و يا 8 بيت براي هر كاراكتر كه در كامپيوتر ها معمول شده است ، يونيكد يك 16 بيت كامل را براي رمزنگاري كاراكتر استفاده مي كند. اين به يونيكد اجازه مي دهد تا تمام حروف ، ايدئوگرافها (تجسم و نمايش افكار ، عقايد و اشيا به وسيله تصاوير) و ديگر علامت هايي كه در زبان هاي نوشتاري جهان و در ارتباط با كامپيوتر ها استفاده مي شود نمايش مي دهد در ابتدا يونيكد براي كامل كردن سيستم اسكي به وجود امد و در آخر جايگزين اسكي شد.
با توجه به اين كه اسكي يكي از برجسته ترين استاندارد ها در محاسبات است، اين يك راه بلند و سخت است.
يونيكد روي هر قسمت صنعت كامپيوتر تاثير مي گزارد ، اما شايد عميقترين تاثير ان روي سيستم هاي عامل و زبان هاي برنامه نويسي باشد.
با توجه به اين نظر ، ما تقريبا در نيمه راه هستيم و ويندوزNT(همان XP خودمان( يونيكد را به صورت كامل پشتيباني مي كند.(متاسفانه ويندوز 98 مقدار كمي از سيستم يونيكد را پشتيباني مي كند) زبان برنامه نويسي سي زماني كه به وسيله ANSI-به پاورقي 2 برويد- به طور ماندگار يونيكد را به واسطه پشتيباني آن از كاراكتر هاي عريض پشتيباني مي كرد كه من آن را با جزييات ان را در زير توضيح خواهم داد.
البته به طور معمول ، ما به عنوان برنامه نويسان با بسياري از كارهاي سخت مواجه شده ايم ، من سعي كرده ام كه اين فشار را به وسيله اماده كردن تمام برنامه نويسان براي يونيكد كم كنم.


پاورقي 1 - American Standard Code for Information Interchange – كد استاندارد امريكا براي مبادله اطلاعات
پاورقي 2 - American National Standards Institute – موسسه استانداردهاي ملي امريكا

kitten
جمعه 16 مرداد 1388, 09:30 صبح
سلام دوستان بالاخره بعد از چند هفته از مسافرت برگشتم و مطالب را كم كم تايپ مي كنم و مي فرستم اينم براي شروع
يك تاريخچه خلاصه از مجموعه هاي كاراكتر:
اين نامعلوم است كه كي بشر شروع به صحبت كردن كرد ، اما به نظر مي رسد كه نوشتن به 6 هزار سال قبل برميگردد. نوشتارهاي اوليه ، نوشته هاي تصويري در طبيعت بود . الفبا فقط حدود 3 هزار سال پيش به وجود آمد. اگر چه زبان هاي نوشتاري متفاوت در جهان براي بعضي مواقع به خوبي به كار امدند بسياري از مخترعان قرن 19 يك نياز براي چيزهاي ديگري احساس كردند. زماني كه ساموئل . اف .بي مورس – به پاورقي 3 مراجعه كنيد - تلگراف را بين سالهاي 1838 تا 1854اختراع كرد. او همچنين يك كد براي استفاده با ان درست كرد. هر حرف در الفبا با يك سري از پالس هاي كوتاه و بلند برابر بود. تفاوتي بين حروف بزرگ و كوچك نبود. اما اعداد و علائم نگارشي كد خاص خود را داشتند.
كد مورس اولين نمونه زبان نوشتاري كه به وسيله چيزي غير از كشيدن و يا نوشتن نمايش داده مي شد نبود. بين سالهاي 1821 تا 1824 ، جواني به نام لوئيس بريل– به پاورقي شماره 5 مراجعه كنيد - از يك سيستم نظامي براي نوشتن و خواندن پيام ها در شب يك كد را براي معماري نقاط برامده در كاغذ براي نوشتن و خواندن كورها الهام گرفت. خط بريل يك كد 6 بيت بود كه حروف ، تركيبات معروف حروف ، كلمات معمول ، و علائم نگارشي را رمزنگاري و مشخص مي كرد. يك كد رمز گريز خاص نشان مي داد كه حروف بعدي به عنوان بزرگ در نظر گرفته شوند و يك تغيير خاص كد اجازه مي دهد كه حروف به عنوان عدد شناخته شوند.
استانداردهاي امريكا:
كدهاي كاراكتر كامپيوترهاي اوليه از سيستم كدينگ هالريت رشد كرد، يك كد كاراكتر 6 بيت كه به عنوان BCDIC – به پاورقي شماره 5 مراجعه كنيد – شناخته مي شد كه مبني بر كدينگ هالريت بود به يك كد 8 بيت با نام EBCDIC در سال 1960 تبديل شد و اين استانداردرا روي مين فريم هاي IBMباقي گذاشت ، كد امريكايي استاندارد براي مبادله اطلاعات (اسكي) اصل خود را در اواخر دهه 1950 داشت و در 1967 به پايان رسيد. در طي توسعه كد اسكي ، يك بحث مهم وجود داشت كه آيا كد بايد 6،7 و يا 8 بيت عريض باشد. براي اين كه قابل اطمينان و رسيدگي باشد به نظر مي رسيد كه اسكي نمي تواند 6 بيت باشد و به خاطر هزينه گزينه 8 بيت هم حذف شد.(در گذشته بيت ها بسيار گران بودند!) و كد آخر داراي 26 حرف كوچك ، 26 حرف بزرگ ، 10 عدد ، 32 نشانه ، 33 كد كنترل و يك فاصله (space) بود كه جمع ان 128 كد است. اسكي به عنوان مجموعه كد كاراكتر 7 بيت كد امريكايي استاندارد براي مبادله اطلاعات به ثبت رسيد.(ANSI X3.4-1986,) و به وسيله انسي منتشر شد. در قسمت بعد در مورد كد اسكي توضيح داده مي شود.
http://kitten2.persiangig.com/121.JPG

حرف هاي خوب زيادي مي توان در مورد اسكي بيان كرد مثلا 26 كد حروف به هم پيوسته هستند. حروف بزرگ مي توانند به حروف كوچك تبديل شوند فقط با معكوس كردن وضعيت يك بت. كدها باري 10 عدد به راحتي از مقدار اعداد نتيجه گرفته مي شوند.(در سيستم BCDIC كد براي كاراكتر "0" به دنبال كد براي كاراكتر "9" مي آيد) بهتر از همه ي اين ها اسكي يك استاندارد قابل اطمينان است. استاندارد ديگري به رايحي و قديمي بودن روي صفحه كليد ، نمايش ويديوها و سخت افزار سيستم ، پرينترها و فايلهاي فونت و سيستمهاي عامل و اينترنت وجود ندارد.

پاورقی
3 – از 1791 تا 1872 مخترع و توسعه دهنده اولین تلگراف موفق و زبان کد مورس
4 – از 1809 تا 1852 مربی فرانسوی ( که در سه سالگی کور شد) و مخترع سیستم بریل برای افراد کور
5 – Binary-Coded Decimal Interchange Code
6 – Extended Binary Coded Decimal interchange Code – کد 8 بیتی که به صورت باینری نشان داده می شود

pswin.pooya
جمعه 16 مرداد 1388, 13:44 عصر
سلام
مطالبی که گذاشتی اشتباه هستش. شکلی که گذاشتی مربوط به مجموعه کارکترهای ANSI هستش. که ترکیب آنسی با OEM تشکیل اسکی رو میده.

یونی کد هم بسته به قالب ترجمه اون میتونه از 7 بیت تا 32 بیت رو اشغال کنه که باز هم قالب ترجمه خودش به دو نوع تقسیم میشه.

کاراکترهای اسکی هم 8 بیت اشغال میکنن در صورتی که آنسی هفت بیت اشغال میکنه.

kitten
شنبه 17 مرداد 1388, 10:08 صبح
دوست عزیز ansi سازمان استاندارد ملی امریکا هستش و نام این مجموعه کاراکتر اسکی است
اینو بخون

پاورقي 1 - American Standard Code for Information Interchange – كد استاندارد امريكا براي مبادله اطلاعات
پاورقي 2 - American National Standards Institute – موسسه استانداردهاي ملي امريكا

ضمنا من دارم تاربخچه مجموعه کاراکتر ها را می گم تا به تاریخچه یونیکد برسم
می تونی مرجع اصلی که از روش ترجمه می کنم را بخونی تا توجیه بشی کتاب خیلی مهمی است و مورد تایید همه است

shs_night
یک شنبه 18 مرداد 1388, 04:26 صبح
مطالبی که گذاشتی اشتباه هستش. شکلی که گذاشتی مربوط به مجموعه کارکترهای ANSI هستش. که ترکیب آنسی با OEM تشکیل اسکی رو میده.

در اشتباه نبودن این جدول(ascii)هیچ شکی نیست , تقریبا در تمام کتابهای آموزشی زبان های برنامه نویسی ,این جدول تحت عنوان ضمیمه موجود میباشد.
البته این تصویر حاوی 128 کاراکتر اول جدول اسکی میباشد و کاراکترهای اسکی توسعه یافته در آن قرار ندارند !!!

در ضمن منظورتان از ترکیب انسی با OEM چیست؟ (اصلا OEM چیست؟)


تاریخچه ASCII :
اسکی یک استاندارد آمریکایی است که که در آن برای نمایش یک کاراکتر(نویسه)از 7 بیت استفاده میشد .بنابراین در مجموع 128 کاراکتر (2 به توان 7 = 128)که شامل حروف بزرگ و کوچک انگلیسی ,علایم نگارش و یکسری کاراکترهای کنترلی (مانند CR,LF و ...)برای دستگاه های خروجی مانند چاپگر و صفحه نمایش قابل تعریف بود .

بعدها این استاندارد گسترش یافت و یک کاراکتر با یک عدد 8 بیتی مشخص می شد ,بنابراین 127 کاراکتر دیگر به استاندارد اسکی اضافه شد و استاندارد اسکی به 256 کاراکتر افزایش یافت و این کاراکترهای اضافی شامل : حروف یونانی و اروپایی ,علامات ریاضی و علامات گرافیکی که برای رسم انواع شکلها به کار برده میشوند, می باشد.
(نکته:به کاراکترهایی با کد اسکی بالاتر از 128 (همانهایی که بعدا اضافه شدند) کاراکترهای اسکی توسعه یافته (Extended ASCII Code) میگویند)

همچنین از این استاندارد در ماشینهای فکس و تلفن های همراه و دیگر دستگاههای دیجیتالی انگلیسی زبان استفاده میشود.

پس از مدتی برای حمایت از زبانهای بیشتر استاندارد ANSI تهیه شد که در آن به جای استفاده از
کاراکترهای اسکی توسعه یافته(کد اسکی بالاتر از 128) از کاراکترهای آن زبان استفاده میشد در این استاندارد(ANSI)به هر زبان یک شماره یکتا اختصاص می یابد که به آن Code Page می گویند و با توجه به Code Page فعلی میتوان رشته های کاراکتری را به عنوان زبان خاصی تعبیر کرد, اما در صورتی که Code Page فعلی پیش فرض سیستم باشد یا برای سیستم یک شماره زبان خاص که در استاندارد ANSI تعریف شده است ,معین نشود در رشته های کاراکتری بایت هایی با مقدار
بزرگتر از 128 همان کاراکترهای اسکی توسعه یافته تعبیر میشود.

نکته: داس از ASCII پشتیبانی میکند(البته در نسخه 6 آن راه انداز ابزارهای مناسبی برای پشتیبانی از استاندارد ANSI تعبیه شده است که با بارگذاری آنها در Config.sys میتوان از زبانهای این استاندارد بهره برد)

مثال: فرض میکنیم بر روی سیستم شما فقط زبان انگلیسی نصب است اکنون با برنامه NotePad را اجرا کنید و در حالی که دکمه Alt را پایین نگه داشتید عدد 228 را تایپ نمایید ,شما اکنون کاراکتر سیگما را میبینید (که جزو کاراکترهای اسکی توسعه یافته است).اما اگر بر روی سیستم شما زبان فارسی نصب باشد شما کاراکتر 'غ'را خواهید دید.
اکنون به محیط کامند پرومپت(cmd) بروید و همین کار را تکرار کنید چه میبینید ؟ (چه زبان فارسی نصب باشد یا نباشد شما سیگما را می بینید )


موفق باشید

shs_night
یک شنبه 18 مرداد 1388, 04:40 صبح
شاید این به کارتان بیاید!!!

pswin.pooya
یک شنبه 18 مرداد 1388, 07:51 صبح
خوبه!

مشکل شما همینه. به 128 کاراکتر اول آنسی مگین و به 128 کارکتر بعد بلوک توسعه یافته یا OEM میگن که بعدا اضافه شده به جمع اینها هم اسکی میگن. به خاظر همین هستش که هیچ شکی نیست و توی تمام کتابها میتونی اون جدول رو ببینی. مشکل همیجاست متن رو نخونده نظر میدی.

نکته: cmd داخل ویندوز یه شبیه ساز هستش که داس رو اجرا میکنه و محیط اون رو شبیه سازی میکنه پس ربطی به زبان ویندوز نداره.

نکته: داخل همون notpad زمان save کردن قالب save رو از پایین پنجره نگاه کن ( میبینی نوشته ANSI) .

آنسی بعدا اضافه نشده این اسکی هستش که بعدا ساخته شده. به عنوان مثال خیلی از LCDها آنسی رو میشناسن ولی پشتیبانی از اسکی نمی دن.

مساله code page ها رو فعلا با این مساله قاطب نکن که باعث میشه حتی این جدول اسکی رو هم که بلدی یادت بره.

یه بار دیگه هم شده خودتو محک بزن بعد در مورد شکها و تردیدهات تصمیم بگیر.

nelhami1
یک شنبه 18 مرداد 1388, 09:56 صبح
دوستان سلام. من یک برنامه ساده نقاسی در vc++ 2008 نوشتم. حالا میخوام نقاشی ها رو ذخیره کنم .باید چطور این کارو انجام بدم؟ پیشاپیش از کمکتون ممنونم:متفکر:

kitten
یک شنبه 18 مرداد 1388, 19:39 عصر
اگه شما اجازه بديد من تمام متون درمورد اين موضوع تا رسيدن به خود يونيكد را براتون ميگذارم تو توجيه بشين
مطالب آماده است و فقط تايپ مونده

shs_night
دوشنبه 19 مرداد 1388, 04:23 صبح
با عرض سلام



اگه شما اجازه بديد من تمام متون درمورد اين موضوع تا رسيدن به خود يونيكد را براتون ميگذارم تو توجيه بشين مطالب آماده است و فقط تايپ مونده

بی صبرانه منتظر مطالبت هستیم




خوبه!
مشکل شما همینه. به 128 کاراکتر اول آنسی مگین و به 128 کارکتر بعد بلوک توسعه یافته یا OEM میگن که بعدا اضافه شده به جمع اینها هم اسکی میگن. به خاظر همین هستش که هیچ شکی نیست و توی تمام کتابها میتونی اون جدول رو ببینی. مشکل همیجاست متن رو نخونده نظر میدی.

نکته: cmd داخل ویندوز یه شبیه ساز هستش که داس رو اجرا میکنه و محیط اون رو شبیه سازی میکنه پس ربطی به زبان ویندوز نداره.

نکته: داخل همون notpad زمان save کردن قالب save رو از پایین پنجره نگاه کن ( میبینی نوشته ANSI) .

آنسی بعدا اضافه نشده این اسکی هستش که بعدا ساخته شده. به عنوان مثال خیلی از LCDها آنسی رو میشناسن ولی پشتیبانی از اسکی نمی دن.

مساله code page ها رو فعلا با این مساله قاطب نکن که باعث میشه حتی این جدول اسکی رو هم که بلدی یادت بره.

یه بار دیگه هم شده خودتو محک بزن بعد در مورد شکها و تردیدهات تصمیم بگیر.

امیدوارم منبعی که من از آن مطالب فوق را نوشتم شما را قانع کند تا اینگونه خود و دیگران را با زبانی گزنده به چالشی توخالی نکشید !!!
کتاب برنامه نویسی سیستمی- نویسنده:محمد عادلی نیا,مرضیه مهریزی انتشارات دیباگران تهران

اگر فکر می کنید مطالب کتاب اشتباه است بدون هیچ معطلی آن را به انتشارات گوشزد نمایید شاید جایزه ای برایتان در نظر بگیرند!!!
در ضمن اگر برایتان ممکن است مرجعی برای حرف هایتان معرفی نمایید


OEM سر نام چه جمله ای میباشد؟
در دیکشنری تشریحی کامپیوتر مایکروسافت مطلبی درباره OEM که ربطی به موضوعمان داشته باشد نیافتم ممنون میشوم اگر توضیحی بدهید.

shs_night
دوشنبه 19 مرداد 1388, 04:26 صبح
دوستان سلام. من یک برنامه ساده نقاسی در vc++ 2008 نوشتم. حالا میخوام نقاشی ها رو ذخیره کنم .باید چطور این کارو انجام بدم؟ پیشاپیش از کمکتون ممنونم:متفکر:
سلام
شاید بهتر باشد تاپیک جدیدی باز کنید

kitten
سه شنبه 27 مرداد 1388, 08:54 صبح
آن سوی جهان :

مشکل بزرگ اسکی کلمه اول مخفف است . اسکی در واقع استاندارد امریکا است و حتی به اندازه کافی برای دیگر کشورهایی که انگلیسی صحبت می کنند خوب نیست. مثلا در کد اسکی علامت پوند کجا است؟
انگلیسی از الفبای لاتین (رومی) استفاده می کند. در میان زبانهای نوشتاری که از الفبای رومی استفاده می کنند. انگلیسی در یک سری از کلمات که حروفشان نیاز به علائم فرائتی دارند نامعمول است. حتی برای آن کلمات انگلیسی که تلفظ آن ها مناسب است مانند Cooperative or Resume. تلفظ بدون علائم هم قابل قبول است.
اما شمال و جنوب ایالات متحده امریکا وسرتاسر اقیانوس اطلس کشورهای زیادی هستند و زبان هایی که علائم قرائتی بیشتر هستند معمول هستند. این علائم قرائتی به طور معمول در وفق دادن الفبای لاتین و تفاوت ها در گفتار بین این زبان ها کمک کرده اند.
با سفرکردن دورتر از شرق یا جنوب اروپای غربی شما با زبان هایی که اصلا از الفبای لاتین استفاده نمی کنند مواجه خواهید شد. مانند زبان های یونانی ، هبری ، عربی و روسی که از الفبای Cyrillic استفاده می کنند .
این تاریخچه اسکی از 1967 بیشتر تاریخچه تلاش ها و کوشش ها برای غلبه کردن بر محدودیت های آن و ساختن اسکی برای این که برای دیگر زبان ها به جز انگلیسی امریکایی قابل قبول باشد است. در سال 1967 برای مثال سازمان استاندارد بین المللی (iso) – به پاورقی 7 مراجعه شود- به نوع متفاوت اسکی با کدهای 0x40, 0x5B,0x5C,0x5D,0x7B,0x7C,0x7D را برای استفاده ملی کنار گذاشت و کدهای 0x5E,0x60,0x7E که ممکن است در زمان های دیگری برای علامت های گرافیکی لازم باشد. مشخص است که این بهترین راه برای بین المللی کردن نیست چون ضمانت سازگاری در ان وجود ندارد.
توسعه دادن اسکی :

زمانی که اولین کامپیوترهای کوچک تولید شدند ، سیستم 8 بیت تاسیس شد. بنابراین زمانی که یک بایت برای ذخیره کردن کاراکتر ها استفاده می شد ، 128 کاراکتر اضافه می تواند اختراع بشود تا اسکی را کامل کند. زمانی که pc شرکت IBM در سال 1981 تاسیس شد . کارتهای گرافیکی شامل 256 کاراکتر فقط خواندنی می شدند. که خود آن یکی از مهمترین قسمتهای استاندارد IBMبود.
مجموعه کاراکتر های توسعه یافته شرکت IBM شامل چند کاراکتر گویشی (قرائتی) و حروف کوچک زبان یونانی (که در ریاضی کاربرد دارد) می شد. کاراکترهای اضافی نیز همچنین در موقعیت کدهای کاراکترهای کنترلی اسکی مشخص شدند. چون قسمت بزرگی از این کاراکترهای کنترلی بدون استفاده بودند.
مجموعه کاراکترهای توسعه ای شرکت IBM در حافظه فقط خواندنی بی شمار برد تطبیق دهنده و پرینتر ها قرار داده شد و این در بسیاری از برنامه ها استفاده می شد تا ان را با سیستم نمایش کاراکتری آن زینت بدهد. اما ، این مجموعه کاراکتر تمام حروف گویشی را برای زبان های اروپای غربی که با الفبای لاتین بودند شامل نمی شد. و ان به طور کامل برای ویندوز مناسب نبود . ویندوز نیازی به کاراکترهای کشیدن خط نداشت چون از سیستم گرافیکی کاملی استفاده می کرد.
در ویندوز نسخه یک که در نوامبر 1985 منتشر شد. مایکروسافت به طور کامل مجموعه کاراکترهای IBM را رها نکرد اما آن در جایگاه دوم قرار داشت. مجموعه کاراکتر بومی ویندوز مجموعه کاراکتر ansi نامیده می شد چون آن براساس پیشنویس ANSI و استاندارد ISO بود که در آخر به ANSI/ISO 885911987 تبدیل شد.(استاندارد ملی امریکا برای پردازش اطلاعات مجموعه کاراکتر 8 بیت گرافیکی) که با نام latin 1 شناخته شد.
نسخه اصلی مجموعه کاراکتر انسی که درنسخه 1 مرجع برنامه نویسان ویندوز بود در زیر مشخص است.
http://kitten2.persiangig.com/ansi.png



پاورقی:

7 – International standard organization

kitten
سه شنبه 03 شهریور 1388, 18:56 عصر
مجموعه کاراکتر انسی برای ویندوز:
مربع توخالی کدهایی را که هنوز مشخص نشده اند مشخص می کندANSI/ISO 8859-1 فقط کاراکترهای گرافیکی را نمایش می دهد نه کاراکترهای کنترلی. بنابراین DEL تعریف نشد.بعلاوه کد 0xA0 به عنوان فاصله نشکن تعریف شدبه این معنا که ان فاصله (SPACE) نباید برای پایان رساندن خط استفاده شود و کد 0xAD یک خط تیره اختیاری است به این معنا که نباید نمایش داده شود مگر برای شکستن یک کلمه در آخر خط همچنین ANSI/ISO 8859-1 کدهای 0xD7 علامت ضرب (x)و 0xF7 را به عنوان علامت تقسیم معرفی کرد.بعضی از فونت ها در ویندوز نیز بعضی از کاراکتر ها را از 0x80 تا 0x9F معرفی کرد.که این جز استاندارد نبود.
داس نسخه 3.3 که در اوریل 1987 منتشر شد عقیده صفحات کد کاربران PC شرکت IBM را معرفی کرد.عقیده ای که همچنین به ویندوز هم آمد.یک صفحه کد به عنوان یک نقشه برداری کدهای کاراکتر به کاراکتر معرفی می شود.مجموعه کاراکتر اورجینال IBM به عنوان صفحه کد 437 یا MS-DOS Latin US مشخص شد و صفحه کد 850 همان MS-DOS Latin 1 است که بعضی از کاراکتر های طراحی خط را با حروف گویشی اضافی جابه جا کرد. دیگر صفحه کد ها برای دیگر زبان ها معرفی شدند.128 کد پایین همیشه یکسان هستند و 128 کد بالایی بسته به زبانی که صفحه کد معرفی می کند است.
در ms dos اگر کاربری کیبورد سیستم ، کارت گرافیکی و پرینتر را به یک صفحه کد خاص تنظیم کند و سپس به ایجاد ، ویرایش و یا پرینت اسناد داخل سیستم بکند همه چیز به خوبی پیش خواهد رفت.همه چیز سازگار است.اما ، اگر کاربر تلاشی برای مبادله اسناد با کاربر دیگری که از صفحه کد متفاوتی استفاده می کند داشته باشد.نتیجه مشکل های زیادی است.کدهای کاراکتر ها با کاراکترهای اشتباهی مرتبط می شوند. برنامه ها می توانند با ذخیره کردن اطلاعات صفحه کد ها با اسناد داخل ان کاری برای کاهش مشکلات کرده باشند. اما این ساختار بعضی کارها در تبدیل بین صفحه کد ها را درگیر می کند.اگرچه صفحه کد ها اصلا فقط برای کاراکترهای اضافی الفبای لاتین به غیر از کاراکترهای گویشی آماده شدند.در آخر صفحه کد ها 128 کاراکتر بالایی را که شامل الفبای غیر لاتین هستند درست شدند.مانند: هبری و یونانی
صفحه کد ها به خاطر این دلایل پربار شدندو صفحه کدهای سیستم عامل های ms-dos و ویندوز و مکینتاش یکسان نیستند.صفحه کد برای هر محیطی مجموعه کاراکتر اصلاحی برای آن محیط است.

kitten
سه شنبه 03 شهریور 1388, 19:00 عصر
مجموعه کاراکتر Double-Byte :

تاکنون ما به مجموعه 256 کاراکتری نگاه می کردیم. چگونه می توانیم زبانهایی مانند کره ای ، ژاپنی ، چینی را وفق دهیم در حال که هنوز با سیستم اسکی سازگار باشند؟
را حل (اگر کلمه ای مناسب برای ان باشد)مجموعه کاراکتر Double-Byte است(DBCS- به پاورقی شماره 8 مراجه شود- یک DBCS با 256 کد مانند اسکی شروع می شود. مانند یک صفحه کد خوب رفتار 128 تای اول این کد ها همان ASCII هستند. اما بعضی از کدها در بالای 128 همیشه با بایت دوم می آیند.هر دو بایت با یکدیگر که به نام های (lead byte) و (trail byte) معروفند یک کاراکتر منفرد را معرفی می کنند. معمولا یک ideograph پیچیده هستند. اگر چه چینی و ژاپنی و کره ای بسیاری از ایدوئوگرافها را سهیم هستند . به طور معمول زبان های متفاوتی هستند. و معمولا ایدئو گراف های شبیه به هم در سه زبان متفاوت سه چیز مختلف را نمایش می دهند.ویندوز چهار نوع مجموعه کاراکتر Double-Byte را پشتیبانی می کند. صفحه کد 932(ژاپنی) ، صفحه کد 936(چینی ساده) ، 949 (کره ای) و 950 (چینی باستانی) پشتبانی می شوند. در نسخه های ویندوزی که برای این کشورها تولید شده است.
مشکل با مجموعه کاراکتر Double-Byte این نیست که با 2 بایت نمایش داده می شود. مشکل بعضی از کاراکترها (به طور خاص ، کاراکترهای اسکی) هستند که با یک بایت نمایش داده می شوند.این مشکلات برنامه نویسی عجیبی به وجود می آورد. برای مثال ، تعداد کاراکتر ها در یک رشته کاراکتر به وسیله سایز رشته تعیین نمی شود. رشته باید مجزا شود تا بتوان اندازه آن را تعیین کرد. و هر بایت باید امتحان شود تا بفهمیم که آیا ان یک کاراکتر 2 بایتی است یا نه؟ اگر شما یک اشاره گر به یک کاراکتر در میان یک رشته DBCS داشته باشید. ادرس کاراکتر قبلی آن رشته چیست؟ راه حل معمول آن تجزیه رشته از ابتدا تا اشاره گر مورد نظر است.

یونیکد برای رهایی :

مشکلات ساده ای که ما اینجا داریم این است که زبان نوشتاری جهان به راحتی قادر به نمایان شدن به وسیله کد 8 بیت 256 نیست. راه حل قبلی شامل صفحه کد ها و DBCS آزمایش شد و جواب خوبی نداد. راه حل واقعی چیست؟
به عنوان برنامه نویس ، ما با این نوع مشکلات تجاربی بدست آورده ایم. اگر چیزهای زیادی برای نمایش به وسیله ارزش 8 بیتی وجود داشته باشد. ما ارزش های عریض تر را امتحان می کنیم.ممکن است ارزش گزاری 16 بیتی را . و این عقیده مسخره آمیز پشت یونیکد است. نه تنها سردرگمی که چندین نقشه کد کاراکتر 256 یا مجموعه کاراکتر Double-Byte که بعضی از آنها کد 1 بایت دارند و بعضی 2 بایت. یونیکد یک سیستم 16 بیت یک شکل و یکنواخت است.بدین سان اجازه ی نمایش 65536 کاراکتر را به ما می دهد این برای همه ی کاراکتر ها و ایدئو گراف ها در تمام زبانهای نوشتاری جهان کافی است به همراه گروه ریاضی و علائم و کلکسیون اشیا.
فهمیدن تفاوت بین یونیکد و DBCS لازم است ، یونیکد برای استفاده ( به طور خاص در زبان برنامه نویسی c) کاراکتر های عریض است. هر کاراکتر در یونیکد 16 بیت عرض دارد که بیش از 8 بیت است.ارزش 8 بیتی در یونیکد معنایی ندارد.مجموعه کاراکتر Double-Byte که ما هنوز به آن اشاره داریم بعضی بایت ها کاراکتر ها را به وسیله خودشان معرفی می کنند . بعضی بایت ها نشان می دهند که بایت دیگری لازم است تا یک کاراکتر تعریف شود.
در حالی که کار با رشته های DBCS کاملا سخت است. کار با متون یونیکد بیشتر شبیه به کار با متن معمولی است. شما احتمالا خوشحال خواهید شد که بدانید که 128 کاراکتر اولیه یونیکد (0x0000 تا 0x007F) همان اسکی هستند.در حالی 128 تای دوم یونیکد از (0x0080 تا 0x00FF) همان iso 8859-1 الحاقیات اسکی هستند. بلوک های گوناگون کاراکتر ها داخل یونیکد به طور مشابه بر پایه استانداردهای موجود هستند.این یک تبدیل آسان است و الفباهای یونانی و هبری و ژاپنی و چینی و ... کدهای خاص خود را دارند. بهترین چیز در مورد یونیکد این است که فقط یک مجموعه کاراکتر وجود دارد و در آن هیچ ابهامی نیست.
یونیکد از میان همکاری مجازی هر کمپانی مهمی در صنعت کامپیوتر شخصی اتفاق افتاد و برابر با استاندارد iso 10646-1 است.مرجع لازم برای یونیکد کتاب The Unicode Standard است.(version 2.0 – Addison Wesley , 1996)
یک کتاب فوق العاده که قدرت و تنوع زبان های نوشتاری جهان را آشکار کرد. علاوه بر این ، کتاب بنیاد و پایه و جزئیات پشت توسعه یونیکد را نشان می دهد.
آیا اشکالی در یونیکد هست؟ البته. رشته های کاراکتر یونیکد دو برابر رشته های اسکی فضا اشغال می کنند. به هر حال ، فشرده سازی فایل ها کمک می کند تا فضای دیسک تغییر نکند اما شاید بدترین اشکال آن است که یونیکد یک وابستگی به کار نرفته باقی می گذارد.

پاورقی :
8 – Double Byte Character Set

kitten
دوشنبه 09 شهریور 1388, 08:51 صبح
کاراکتر های عریض و زبان سی

برای یک برنامه نویس سی همه ی ایده کاراکترهای 16 بیت به طور مطمئن می تواند سردی سخت را از بین ببرد.هر یک کاراکتر که همان عرض به عنوان یک بایت را دارد یکی از نادرترین تضمین های زندگی است.تعداد کمی از برنامه نویس ها می دانند که ANSI/ISO 9899-1990– به پاورقی 9 مراجعه شود- (که به عنوان “ANSI C” شناخته می شود) مجموعه های کاراکتری که بیش از یک بایت برای هر کاراکتر نیازدارد را پشتیبانی می کند.که به ان کاراکترهای عریض می گویند. این کاراکترهای عریض به خوبی با کاراکترهای معمولی و رایج جور هستند.
ANSI C همچنین مجموعه های کاراکتر چندبایتی را نیز پشتیبانی می کند.مانند نسخه های چینی ، ژاپنی و کره ای ویندوز. اما این مجموعه های کاراکتر ، با آنها به عنوان رشته های تک بایتی رفتار می شود که در آن بعضی از کاراکترها معنی کاراکترهای پی در پی را از بین می برند.مجموعه کاراکترهای چند بایتی عموما روی توابع کتابخانه ای زمان اجرای سی تاثیر می گذارد.کاراکترهای عریض به طور یکسانی عریض تر از کاراکترهای معمولی هستند و موجب بعضی مشکلات کامپایلرها می شوند.
کاراکترهای عریض لزوما یونیکد نیستند.یونیکد یکی از سیستم های کد گذاری کاراکترهای عریض است.اما تمرکز در این کتاب روی ویندوز بیشتر از خلاصه ابزار سی است.من در مورد یونیکدو کاراکترهای عریض صحبت خواهم کرد.
نوع داده char
احتمالا ، ما همگی با تعریف و ذخیره کاراکترها و رشته های کاراکتری در برنامه های سی خودمان به وسیله نوع داده char آشنا هستیم.اما برای آسان کردن فهم این که چگونه زبان سی با کاراکترهای عریض کار می کند بیایید تا ابتدا تعریف کاراکترهای معمولی را دوره کنیم.
کد زیر یک متغیر که دارای یک کاراکتر است را تعریف و مقدار دهی می کند.
Char c=’A’;
متغیر c برای ذخیره به یک بایت نیاز دارد و با مقدار هگزادسیمال 0x41 شناخته می شودکه کد اسکی برای حرف A است.
شما می توانید یک اشاره گر به یک رشته کاراکتری تعریف کنید. مانند:


Char * p;

kitten
دوشنبه 09 شهریور 1388, 09:03 صبح
به خاطر این که ویندوز یک سیستم عامل 32 بیت است ، اشاره گر P به 4 بایت برای ذخیره نیاز دارد.شما همچنین می توانید یک اشاره گر را به یک رشته کاراکتری مقدار دهی کنید.

char * p=”Hello!”;
متغیر p هنوز هم به 4 بایت برای ذخیره مانند قبل نیاز دارد.رشته کاراکتری در حافظه ثابت ذخیره می شود و از 7بایت برای ذخیره استفاده می کند.( 6 بایت برای رشته به علاوه کاراکتر اخر 0).
شما همچنین می توانید یک ارایه از کاراکترها را به شکل زیر تعریف کنید.

char a[10];
در این مورد ، کامپایلر 10 بایت را برای ذخیره ارایه رزرو می کند. عبارت sizeof(10) عدد 10 را بر خواهد گرداند. اگر یک آرایه global است( که خارج از تمام توابع تعریف شده است) شما می توانید ارایه کاراکترها را به وسیله عبارتی مانند زیر مقدار دهی کنید

char a[] = "Hello!";
اگر شما این آرایه را به عنوان یک متغیر محلی برای تابع تعریف کنید ان باید به عنوان static تعریف شود.:
Static char a[] = “Hello!”;
در هر یک ، رشته در حافظه ثابت برنامه ذخیره می شود با یک افزودن یک 0 در آخر آن.بنابراین به 7 بایت برای ذخیره نیاز دارد.
پاورقی :
9 –American National Standard for Programming Languages

kitten
شنبه 14 شهریور 1388, 09:38 صبح
کاراکترهای عریض تر:
هیچ چیزی درباره یونیکد یا کاراکترهای عریض تر معنی نوع داده char در زبان c را تغییر نمی دهد.نوع char از یک بایت برای ذخیره سازی استفاده می کند و عبارت sizeof(char); مقدار یک را بر میگرداند.در نظر ، یک بایت در زبان سی می تواند بیشتر از هشت بیت باشد ، اما برای بیشتر ما یک بایت هشت بیت عرض دارد.
کاراکترهای عریض تر در زبان سی بر پایه نوع داده wchar_t هستند که در بسیاری از سرفایلها تعریف شده اند. مانند:wchar.h و تعریف ان به صورت زیر است:
typedef unsigned shot wchar_t;
بنابراین ، نوع داده wchar_t مانند نوع داده unsigned shot integer است.(16 بیت عرض دارد.) برای تعریف یک متغیر شامل یک کاراکتر عریض تک از عبارت زیر استفاده کنید:
wchar_t c = 'A';
متغیر c 2 بایت دارد و مقداری برابر 0x0041 که نمایش یونیکد حرف A است.(هرچند چون ریزپردازنده های اینتل اول مقادیرهای چند بایتی را با کمترین اهمیت بایت ذخیره می کند ، بایت در واقع در حافظه در گروه 0x00, 0x0041 ذخیره می کند.(این را در حافظه خود نگه دارید ، اگر شما حافظه متن یونیکد را امتحان می کنید)شما همچنین می توانید یک اشاره گر را به یک رشته کاراکتر عریض متصل کنید:
wchar_t * p = L"Hello!";
اگاه باشید که حرف بزرگ L(برای Long) قبل از علامتهای نقل قول می آید.این به کامپایلر نشان میدهد که رشته باید با کاراکترهای عریض ذخیره شود.(هر کاراکتر 2 بایت را اشغال می کند)اشاره گر به متغیر p به طور معمول برای ذخیره سازی 4 بایت نیاز دارد.اما رشته کاراکتری به 14 بایت نیاز دارد.(2 بایت برای هر کاراکتر به علاوه 2 بایت برای صفر آخر)
مانند قبل ، شما می توانید یک آرایه کاراکترهای عریض را به صورت زیر تعریف کنید:
static wchar_t a[] = L"Hello!";

kitten
شنبه 14 شهریور 1388, 09:51 صبح
این رشته به 14 بایت برای ذخیره سازی نیازمند است ، و عبارت sizeof(a); مقدار 14 را برمیگرداند. شما می توانید آرایه a را ایندکس (فهرست) کنید.تا کاراکترهای معمولی را بدست آورید.مقدار a[1] که یک کاراکتر عریض است ‘e’ می باشد.(00x0065)
اگر چه این بیشتر شبیه به یک اشتباه است تا هر چیز دیگری ولی ان L که قبل از اولین علامت نقل قول امده است خیلی مهم است و نباید بین این دو نماد فاصله ای باشد. فقط با استفاده از ان L کامپایلر می فهمد که شما می خواهید که رشته در 2 بایت برای هر کاراکتر ذخیره شود.وقتی ما به رشته های کاراکتری عریض در جاهای دیگری از تعریف های متغیر نگاه می کنیم ، شما با هم حرف L را قبل از علامت نقل قول خواهید داشت.خوشبختانه ، کامپایلر زبان سی معمولا به شما یک error یا warning می دهد ، وقتی که شما حرف L را فراموش می کنید.
شما همچنین می توانید پیشوند L را در تک کاراکترها نیز استفاده کنید ، مانند خط زیر که برای این که مشخص کنیم که باید به عنوان کاراکتر عریض معرفی شود.
wchar_t c = L'A';
اما معمولا لازم نیست ، کامپایلر سی با صفر کاراکتر را ادامه می دهد.
توابع کتابخانه ای کاراکترهای عریض:
همگی ما میدانیم که به چه شکل اندازه یک رشته را بدست اوریم.اگر ما یک رشته کاراکتری مانند زیر تعریف کرده باشیم:
char * pc = "Hello!";
می توانیم اندازه رشته را با استفاده از خط زیر بدست آوریم:
iLength = strlen(pc);
متغیر iLength مقداری برابر با 6 خواهد داشت.(برابر با تعداد کاراکتر ها در رشته)
خوب ، حالا باید یک اشاره گر به یک رشته از کاراکتر های عریض تعریف کنیم:
wchar_t * pw= L"Hello!";
و حالا دوباره تابع strlen() را صدا می زنیم:
iLength = strlen(pw);
از حالا مشکلات شروع می شود ، اول کامپایلر پیام warning می دهد. احتمالا یک چیزی شبیه به خط زیر :

'function' : incompatible types - from 'unsinged short *' to 'Const char *'

kitten
شنبه 14 شهریور 1388, 10:01 صبح
این پیغام به ما می گوید ، که تابع strlen() برای قبول کردن یک اشاره گر به char تعریف شده است و الان یک اشاره گر به unsigned short دارد. شما هنوز میتوانید برنامه را کامپایل و اجرا کنید.اما شما مقدار iLength را عدد یک بدست می آورید.چه اتفاقی افتاده است؟
6 کاراکتر از رشته کاراکتری “Hello!” دارای 16 بیت است.

0x0048 0x0065 0x006C 0x006C 0x006F 00x0021
که در حافظه به وسیله ریزپردازنده های اینتل به صورت زیر ذخیره می شود:

48 00 65 00 6C 00 6C 00 6F 00 21 00
تابع strlen() فکر می کند که باید اندازه ی رشته از کاراکترها را پیدا کند.اولین بایت را به عنوان اولین کاراکتر شمارش می کند. اما بعد فکر می کند که دومین بایت همان صفری است که در آخر رشته می آید.
کمی تمرین به طور واضح اختلاف های بین خود زبان c و توابع کتابخانه ای حین اجرا را نمایش می دهد.کامپایلر رشته L”Hello!” را به عنوان یک کلکسیون 16 بیت از اعداد short integer معنی می کندو آنها را در آرایه wchar_t ذخیره می کند.کامپایلر همچنین هر آرایه فهرست شده و عملگر sizeof() را کنترل می کند.بنابراین آنها به خوبی کار می کنند.اما توابع کتابخانه ای حین اجرا مانند strlen() در طی زمان link کردن اضافه می شوند.این توابع رشته ها را کاراکترهای یک بایتی میدانند. وقتی آنها با کاراکترهای عریض مواجه می شوند.انها آن طوری که ما دوست داریم رفتار نمی کنند.
خوب ، حالا هر تابع کتابخانه ای زبان سی باید بازنویسی شود تا کاراکترهای عریض را پشتیبانی کند. خوب همه ی توابع کتابخانه ای که نه ، فقط انهایی که ارگومان رشته ای دارند.و شما نیاز به بازنویسی انها ندارید.این کار قبلا انجام شده است.
نسخه کاراکتر عریضی تابع strlen() با نام wcslen() نام گذاری شده است.(Wide character string length) و آن در هر دو سرفایل string.h و wchar.h تعریف شده است.تابع strlen() چیزی شبیه به این تعریف شده است.
size_t __cdecl strlen(const char *);
و تابع wcslen() چیزی شبیه به این است:
size_t __cdecl wcslen(const wchar_t *);
بنابراین حالا می دانیم که زمانی که می خواهیم اندازه یک رشته کاراکتر عریض را بدست اوریم. میتوانیم از تابع wcslen() استفاده کنیم:
iLength = wcslen(pw);
تابع مقدار 6 را بر می گرداند.(تعداد کاراکترهای داخل رشته) این را به خاطر بسپارید که وقتی که شما به کاراکترهای عریض بروید، اندازه کاراکتر از یک رشته تغییری نمی کند .فقط اندازه بایت ها تفاوت می کند.
تمام توابع کتابخانه ای حین اجرای زبان سی که آرگومان رشته ای می پذیرند.دارای نسخه کاراکترهای عریض نیز هستند. برای مثال ، Wprintf نسخه کاراکتری عریض تابع printf است. این توابع در هر دو سر فایل wchar.h و سرفایلی که تابع معمولی تعریف شده است، تعریف شده اند.

kitten
شنبه 14 شهریور 1388, 10:10 صبح
نگهداری یک تکه سورس:
مطمئنا ضررهایی در استفاده از یونیکد وجود دارد ، اولین و مهمترین ان است که هر رشته در برنامه شما دو برابر فضا اشغال خواهد کرد به علاوه شما مشاهده خواهید کرد ،که توابع کتابخانه ای حین اجرای کاراکترهای عریض بزرگتر از توابع معمولی هستند.برای این دلیل ، شما ممکن است که بخواهید 2 نسخه از برنامه ی خود را ایجاد کنید.(یکی با رشته های اسکی و دیگری با رشته های یونیکد)بهترین راه این است که شما یک فایل سورس کد را نگه دارید که بتوانید برای هر کدام اسکی یا یونیکد کامپایل کنید.
اگرچه ان کمی مشکل است ، چون توابع کتابخانه ای حین اجرا دارای نامهای متفاوتی هستند ، شما به سختی کاراکترها را تعریف می کنید و شما باید مراقب حرف L نیز باشید!
یکی از راه حل ها ، این است که از سرفایل tchar.h که در Microsoft Visual C++ است استفاده کنید.این سرفایل قسمتی از استاندارد ANSI C نیست.بنابراین تعریف هر تابع و ماکرو که در ان است به دنبال یک زیر خط (_) امده است. سرفایل tchar.h یک مجموعه از نامهای جایگزین برای توابع کتابخانه ای حین اجرای معمولی که نیاز به پارامتر های رشته ای دارند اماده کرده است.(برای مثال، _tprintf , _tcslen). این ها بعضی مواقع به نامهای توابع عمومی نامیده می شوند.چون آنها می توانند به هر کدام یونیکد یا نسخه های غیر یونیکد از توابع متصل شوند.
اگر که شناساگر _UNICODE در سرفایل tchar.h تعریف شود که در برنامه شما include شده است ، _tcslen به عنوان wcslen معرفی می شود.
#define _tcslen wcslen
اگر یونیکد معرفی نشود ، _tcslen به عنوان strlen() معرفی می شود:
#define _tcslen strlen
و غیره.سرفایل tchar.h همچنین مشکل دو نوع داده کاراکتری را با یک نوع داده دیگر که TCHAR نام دارد حل کرده است.اگر که شناساگر _UNICODE تعریف شده باشد TCHAR همان wchar_t است:
typedef wchar_t TCHAR;
در غیر این صورت ، TCHAR همان char خودمان است.
typedef char TCHAr;
حالا زمان ان است که مشکل L چسبان با رشته را حل نماییم.اگر یونیکد تعریف شده باشد ، ماکرویی که __T نامیده می شود به صورت زیر تعریف می شود:
#define __T(x) L##x
این نماد نسبتا واضحی نیست ، ولی آن در استاندارد ANSI C برای پیش پردازنده ها است.این قسمت “token paste” نامیده می شود. و موجب می شود که حرف L به پارامتر ماکرو اضافه شود.بنابراین ، اگر که پارامتر ماکرو رشته “Hello!” باشد ، سپس ##x به رشته L”Hello!” تبدیل می شود. اگر که شناساگر یونیکد تعریف نشده باشد ، ماکرو __T به صورت زیر تعریف می شود.
#define __T(x) x
بدون هیچ نگرانی دو ماکرو دیگر مانند ماکرو __T تعریف شده است.
#define _T(x) __T(x)
#define _TEXT(x) __T(x)
که از یکی از آنها در برنامه های win32 خود استفاده می کنید. عموما ، رشته های خود را با استفاده از دو ماکروی _T یا _TEXT به صورت زیر تعریف کنید:
_TEXT("Hello!");