این بحث در رابطه با ارتباط دادن اکسل با فایل‌های متنی است.

در مورد اینکه چطور با استفاده از ماکروها داده‌هایی را از اکسل در یک فایل متنی ذخیره کنیم یا چطور داده‌هایی را از یک فایل متنی وارد اکسل کنیم.

همچنین در مورد کدهای اَسکی و یونیکد و UTF-8 است که یک بحث حاشیه‌ای است و ناچارا از عددها و کاراکترهای زیادی استفاده شده است.

منابع استفاده شده:  1 سایت Coursera و 2 سایت SmashingMagazine است.

داستان پر رمز متن‌ها و عددها:

می‌دونیم کامپیوتر فقط عددها رو می‌فهمه. پس برای برقراری ارتباط لازم هست که به اعداد معنا بدیم.

فرض کنید من می‌گم عدد 1 معادل حرف "الف" در فارسی هست. عدد 2 معادل حرف "ب" هست و به همین ترتیب به اعداد بعدی حروف دیگر الفبا را نسبت می‌دم.

فرض کنید شما هم یک برنامه‌نویس هستید و از اونجایی که برنامه‌نویس‌ها از صفر شروع می‌کنند به شمردن، میاید و می‌گید که به جای عدد 1، عدد 0 معادل حرف "الف" در فارسی هست. و عدد 1 معادل حرف "ب" در فارسی هست. یعنی با یک عدد اختلاف بین اعداد و حروف تناظر برقرار می‌کنید.

حالا من میام به شما یک پیام می‌فرستم.مثلا می‌گم "سلام".

سلام در کامپیوتر من معادل اعداد س = 15،  ل = 27 ، ا = 1، م = 28 است. این اعداد ابتدا به حالت دودویی یا باینری تبدیل می‌شند 15 = 1111 ، 27 = 11011 ، 1 = 1 ، 28 = 11100 و به کامپیوتر شما میاند. کامپیوتر شما این بیت‌ها رو می‌گیره و به همان اعداد 15 ، 27 ، 1 ، و 28 تبدیل می‌کنه. اما تفسیر کامپیوتر شما از این اعداد متفاوت هست. کامپیوتر شما این اعداد را به حروف 15 = ش، 27 = م، 1 = ب، 28 = ن تفسیر می‌کند. بنابراین پیامی که به شما می‌رسد "شمبن" می‌شود. اون‌وقت شما جواب می‌دید «حالتخوبه» و من هم پیام شما رو به صورت "چ*گپحناه" می‌بینم.

پس می‌بینید که ارتباط سازنده‌ای ایجاد نمی‌شه.

*علامت ستاره به خاطر این هست که حرف "الف" در کامپیوتر شما معادل 0 است، ولی در کامپیوتر من برای این عدد معادلی وجود ندارد.

راه حلچیه؟

انجمن استاندارد آمریکا در سال 1960 استانداردی را به وجود آورد با نام اَسکی ASCII که معادل American Standard Code for Information Interchange است. این استاندارد یک سیستم کدگذاری 7 بیتی را برای کددهی به اعداد تعیین کرد. یعنی از عدد 0000000 تا عدد 1111111 که معادل 0 تا 127 می‌شود. این 128 عدد کافی بودند تا تمام حروف کوچک و بزرگ انگلیسی و کاراکترهای نگارش را کدگذاری کنند.

با نوشتن ماکرو زیر در اکسل می‌تونید کد اسکی این 128 عدد رو ببینید.

Option Explicit

Sub ASCII()

Dim i As Integer

For i = 0 To 127

    Range("A2").Select

    ActiveCell.Cells(i, 1) = i

    ActiveCell.Cells(i, 2) = Chr(i)

Next i

End Sub

به مرور زمان پردازنده‌ها قوی‌تر شدند و از کاراکترهای 8 بیتی برای ذخیره‌سازی اطلاعات استفاده شد. با 8 بیت می‌توان 256 حالت ممکن را ایجاد کرد. یعنی از 0 تا عدد 255.

این 128 حالت اضافه کدهای زاپاس بودند. مثلا IBM اومد کاراکتر 200 ام رو معادل آلفای یونانی قرار داد.

بر خلاف کاراکترهای 0 تا 127 برای کاراکترهای 128 تا 255 هیچوقت استاندارد یک‌پارچه و فراگیری به وجود نیامد.

مثلا برای کامپیوترهای روسی عدد 128 تا 255 معنای متفاوتی داشت. بعدها این سیستم کددهی کدپیج Code Page نامیده شد.

سیستم عامل ویندوز هم کدپیج‌های خودش رو منتشر کرد. از سال 1990 سعی شد که استانداردی برای کدپیچ‌ها به وجود بیاد و هر کدومشون به یک زبان خاص مثل عبری، عربی، ترکی، و زبان‌های دیگه اختصاص داشت. این کد پیج‌ها از شماره ISO-8859-1 تا شماره ISO-8859-16 بودند. استفاده از کدپیچ‌ها مربوط به سال‌های 1990 می‌شه.

حالا اگر من به شما پیام "سلام" رو بفرستم، شما باید شماره کدپیجیکه تفسیر حروف فارسی را داشت می‌دونستید تا پیام من رو به درستی دریافت کنید. کدپیچ حروف فارسی Code Page 1256 بوده است.

یعنی بسته به اینکه از چه استانداردی استفاده می‌کنید عدد 224 می‌تونه معنی‌های مختلفی داشته باشه. ولی عددهای 0 تا 127 همیشه معادل کدهای اسکی بودند.

با تغییر حلقه for در کد بالا و تغییر 127 به عدد 255، می‌تونید کاراکترهای کدهای 128 تا 255 را هم ببینید. دقت کنید که تابع chr می‌تواند ماکزیمم تا عدد 255 که معادل 8 بیت اطلاعات است را قبول کند و اگر عددی بزرگ‌تر از آن را به عنوان ورودی وارد کنید برنامه به شما پیام خطا می‌دهد.

همچنین کاراکترهای 128 تا 255 ممکن است در کامپیوتر من با شما متفاوت باشند.

استفاده از یونیکد Unicode:

برای اینکه مشکل کدگذاری کاراکترها را حل کنند از سال 1980 پیشنهاد شده بود که به هر کاراکتر یک کد خاص اختصاص داده بشه.

در یونیکد از عدد 0 تا 127 معادل با کدهای اسکی است. از عدد 128 تا 255 معادل با نمادهای انواع ارز در دنیا و بعضی از نمادهای پرکاربردتر است.

حالا حرف آلفای یونانی برای هر کسی که از یونیکد استفاده کند برابر 945 است.

در ضمن توجه کنید که کدهای یونیکد به صورت هگزادسیمالی نمایش داده می‌شند. پس اگر حرف H معادل عدد 72 است، در استاندارد یونیکد به صورت U0048 نمایش داده می‌شود.

مشکل استفاده از استاندارد یونیکد:

واضحه که استاندارد یونیکد بسیاری از ابهامات را حل می‌کنه. با اینکه ایده ساده و قشنگ هست اما پیاده‌سازی این ایده کار آسانی نبوده است. چون که برای کدگذاری به بیشتر از 8 بیت اطلاعات احتیاج است. شما با 8 بیت می‌تونید ماکزیمم از 0 تا 255 را برای اعداد مثبت بشمارید. برای اعداد منفی تا 127- را می‌تونید بشمارید. به این خاطر که 1 بیت را باید به علامت منفی اختصاص بدید.

پس برای عددهای بزرگ‌تر به بیت‌های بیشتری نیاز دارید.

حل مشکل پیادهسازی یونیکد:

تعداد کاراکترهایی که می‌خواستند با یونیکد ثبت کنند 1,114,112 کاراکتر بوده است.

با 8 بیت اطلاعات می‌شه 256 کاراکتر را کدگذاری کرد. به راحتی در اکسل با استفاده از تابع Dec2Bin می‌تونید عددها را به حالت دودویی تغییر بدید و ببینید که عدد 255 معادل 11111111 در نمایش دودویی است.  تعداد 1ها رو هم می‌شه با تابع len شمرد. برای بر عکسش هم از تابع Bin2Dec می‌تونید استفاده کنید.

با 16 بیت می‌شه تا 65535 عدد را ثبت کرد که معادل با نمایش FFFF هگزادسیمالی است. برای تبدیل اعداد به نمایش در مبنای 16 می‌تونید از Dec2Hex استفاده کنید.

با 21 بیت می‌شه تا عدد 2,097,151 رسید. این حداقل تعداد بیت لازم برای ثبت همه‌ی کاراکترها است.

پردازنده‌های کامپیوتری هم به مرور زمان پیشرفته‌تر شدند و می‌تونستند داده‌های 32 بیتی یا 64 بیتی را پردازش کنند.

با 32 بیت اطلاعات به راحتی می‌تونید تا بیلیون‌ها کاراکتر را کدگذاری کنید.

اما باز مشلکی پیش میاد. اگر شما بخواید کاراکترها را با 32 بیت کدگذاری کنید به معنای این هست که در ارتباط با بسیاری از برنامه‌هایی که از کدگذاری 8 بیتی استفاده می‌کنند مشکل خواهید داشت.

دوم اینکه برای یک کاراکتر اَسکی انگلیسی که کم‌تر از 7 بیت اطلاعات برای کدگذاری لازم داره از 32 بیت اطلاعات استفاده کردید، که به اندازه 4 برابر اندازه مورد نیاز است.

پدیدآمدن UTF-8:

تلاش‌هایی برای حل این مشکل انجام شد و روش‌های کدگذاری متنوعی مثل UCS2 و UTF-16 و بسیاری دیگر به وجود آمدند. ولی روشی که بیشتر مورد توجه قرار گرفته است UTF-8 است.

کارکرد UTF-8 به این صورت است که از 4 رقم 8 بیتی برای کددهی استفاده می‌‌کند. به این ترتیب اگر کاراکتری فقط به 8 بیت نیاز داشته باشد آن را با 8 بیت اطلاعات و اگر کاراکتری به 10 بیت نیاز داشته باشد آن را با دو عدد 8 بیتی کدگذاری می‌کند. UTF-8 در سال 2003 به مشهورترین قرارداد تنظیم کاراکترها تبدیل شد.