این داستانی است که قدمت آن به روزهای اولیه کامپیوتر برمیگردد. داستان یک طرح دارد. رقابت و دسیسه دارد و نیز عبور از انبوهی از کشورها و زبانها. در آن ناسازگاری و حل و فصل و یک پایان خوش وجود دارد. اما تمرکز اصلی بر روی کاراکترهای ۱۱۰ و ۱۱۶ است. در پایان داستان، همه آنها جای منحصر به فرد خود را در این دنیا پیدا میکنند.
این داستان تعدادی از آن کاراکترها را از نزدیک دنبال خواهد کرد هنگامی که آنها از وب سرور به مرورگر و در جهت مخالف در حرکت هستند. در طول مسیر شما بیشتر درباره تاریخچه کاراکتر، مجموعههای کاراکتری، Unicode و UTF8 اطلاعات پیدا خواهید کرد، و اینکه چرا علامتهای سوال و کاراکترهای استرسدار (accented: علامت تکیهی صدا [بدین شکل’]) عجیب و غریب گاهی در پایگاه دادهها و فایلهای متنی ظاهر میشوند.
اَسکی (ASCII)
کامپیوترها تنها با اعداد سروکار دارند (۰ و ۱) نه با حروف، بنابراین مهم است که همه کامپیوترها بر سر آنکه چه اعدادی نمایش دهنده چه حروفی باشند به توافق برسند.
فرض کنیم کامپیوتر من عدد ۱ را برای A، عدد ۲ را برای B، عدد ۳ را برای C و … و کامپیوتر شما عدد ۰ را برای A، عدد ۱ را برای B و … استفاده کنند. اگر من پیغام HELLO را برای شما ارسال کنم اعداد ۸، ۵، ۱۲، ۱۲ و ۱۵ برای شما ارسال میشوند اما در کامپیوتر شما ۸ به معنای I است پس وقتی کامپیوتر شما پیغام را دریافت میکند آن را به صورت IFMMP نشان میدهد. برای برقراری ارتباط موثر، ما نیاز داریم تا بر سر یک روش استاندارد برای رمزگذاری (encoding) کاراکترها به توافق برسیم.
برای این منظور، در سال ۱۹۶۰ انجمن استانداردهای آمریکا یک رمزگذاری ۷ بیتی که American Standard Code for Information Interchange (ASCII) نامیده میشود، ایجاد کرد. در این روش رمزگذاری HELLO اعداد ۷۲, ۶۹, ۷۶, ۷۶, ۷۹ است و به صورت دیجیتالی بدین گونه ۱۰۰۱۰۰۰ ۱۰۰۰۱۰۱ ۱۰۰۱۱۰۰ ۱۰۰۱۱۰۰ ۱۰۰۱۱۱۱ منتقل میشوند. (یک روش خیلی ساده برای تبدیل اعداد از مبنای ۱۰ به مبنای ۲ استفاده از ماشین حساب ویندوز است. ماشین حساب ویندوز را اجرا کرده و منوی View گزینه Scientific را علامت بزنید تا گزینههایی به ماشین حساب اضافه شود. حال عدد مورد نظر خود در مبنای ۱۰ را وارد کنید و گزینه Bin را که به معنای باینری است انتخاب کنید، عدد به صورت باینری به نمایش درمیآید.)
با استفاده از ۷ بیت، ۱۲۸ مقدار ممکن از ۰۰۰۰۰۰۰ تا ۱۱۱۱۱۱۱ خواهد بود بنابراین ASCII دارای فضای کافی برای همه حروف کوچک و بزرگ لاتین همراه با همه رقمها، علائم نقطه گذاری مشترک، فاصلهها (spaces)، تبها (tabs) و کاراکترهای کنترلی دیگر است. در سال ۱۹۶۸ Lyndon B. Johnson رییس جمهور ایلات متحده آن را رسمی کرد – تمام کامپیوترها باید ASCII را استفاده و درک کنند.
خودتان آن را امتحان کنید
بسیاری از جدولهای اَسکی موجود ۱۲۸ کاراکتر را نمایش میدهند یا توصیف میکنند. شما هم میتوانید یک جدول اَسکی را آنگونه که مایلید با کمی CSS، HTML و جاوا اسکریپت بسازید. کد زیر این کار را انجام میدهد:
<html> <body> <style type="text/css"> p {float: left; padding: 0 15px; margin: 0; font-size: 80%;} </style> <script type="text/javascript"> for (var i=0; i<128; i++) document.writeln ((i%32?'':'<p>') + i + ': ' + String.fromCharCode (i) + '<br>'); </script> </body> </html>
این کد جدولی شبیه این را نشان میدهد:
جدول اَسکی تولید شده توسط جاوا اسکریپت در فایرفاکس
قسمت مهم این کد تابع String.fromCharCode
است. این تابع یک عدد میگیرید و آن را به یک کاراکتر تبدیل میکند. در واقع چهار خط HTML و JavaScript که در ادامه میآیند همگی نتیجه یکسانی را تولید میکنند:
HELLO & #72;& #69;& #76;& #76;& #79; <script>document.write ("HELLO");</script> <script>document.write (String.fromCharCode (72,69,76,76,79));</script>
در خط دوم باید کاراکتر & چسبیده به # باشد اما چون اگر چسبیده می نوشتم وردپرس متن را تبدیل به HELLO می کرد. آن را جدا نوشتم که کد تبدیل نشود و شما متوجه منظور خط دوم بشوید.
بیت هشتم
چاپگرهای راه دور (teleprinter) و بورس از فرستادن ۷ بیت از اطلاعات به یکدیگر کاملاً راضی بودند اما ریز پردازندههای نوظهور در ۱۹۷۰ ترجیح میدادند تا با توانهای ۲ کار کنند. آنها میتوانستند در یک زمان ۸ بیت را پردازش کنند و ۸ بیت (یک بایت byte یا octed [گروه هشت تایی]) را برای ذخیره هر کاراکتر مورد استفاده قرار دهند که ۲۵۶ مقدار ممکن در دسترس خواهد بود.
یک کاراکتر ۸ بیتی میتواند یک عدد را تا ۲۵۵ ذخیره کند اما ASCII تنها تا ۱۲۷ را اختصاص میدهد. مقادیر دیگر از ۱۲۸ تا ۲۵۵ یدکی هستند. در ابتدا PCهای IBM از مقادیر یدکی برای نمایش حروف ویژه استرسدار (accented letters)، نمادها و اشکال مختلف و تعدادی از حروف یونانی استفاده میکرد. به عنوان مثال عدد ۲۰۰ گوشه پایین سمت چپ یک جعبه بود: ╚، و ۲۴۴ حرف آلفای یونانی به صورت کوچک بود: α. به این روش رمزگذاری حروف نام code page 437 داده شد.
با این حال بر خلاف ASCII کاراکترهای ۱۲۸ تا ۲۵۵ هرگز به صورت استاندارد درنیامدند و کشورهای مختلف مقادیر یدکی را با الفبای خودشان شروع میکردند. همه بر سر اینکه ۲۲۴ باید α را نشان دهد توافق نداشتند حتی یونانیان. این منجر به ایجاد تعدادی صفحات کد (code page) جدید شده است. به عنوان مثال در کامپیوترهای IBM روسیه با استفاده از code page 885، عدد ۲۲۴ حرف Я را نشان میدهد. در code page 737 یونانی نشان دهنده امگای کوچک: ω است.
حتی پس از آن نیز اختلاف نظر وجود داشت. از ۱۹۸۰ ویندوز مایکروسافت کد پیجهای خاص خود را معرفی کرد. در کد پیج سیریلیک (Cyrillic) Windows-1251، عدد ۲۲۴ حرف a سیریلیک را نشان میدهد و Я، ۲۲۳ است.
در اواخر ۱۹۹۰ تلاشی در جهت استانداردسازی شکل گرفت. پانزده مجموعه کاراکتری ۸ بیتی مختلف برای پوشش دادن الفباهای گوناگون مانند سیریلیک، عربی، عبری، ترکی و تایلندی شکل گرفت. آنها ISO-8859-1 تا ISO-8859-16 نامیده شدند (برای شماره ۱۲ هیچ مجموعه کاراکتری قرار داده نشده). در ISO-8859-5 سیریلیک، ۲۲۴ حرف p و ۲۰۷، Я را نشان میدهد.
بنابراین اگر یک دوست روسی سندی را برای شما بفرستد، شما در واقع نیاز دارید که بدانید از چه کد پیجی استفاده شده است. سند به خودی خود یک توالی از اعداد است. کاراکتر ۲۲۴ میتواند Я، a یا p باشد. سند با کد پیج اشتباه، شبیه یک دسته از حروف و علائم بهم ریخته دیده میشود.
خودتان آن را امتحان کنید
کد پیجها به عنوان مجموعههای کاراکتری (character sets) شناخته میشوند. میتوانید خودتان این مجموعههای کاراکتری را امتحان کنید اما باید از PHP یا یک زبان سمت سرور شبیه آن استفاده کنید (بطور کلی به این دلیل که کاراکتر نیاز دارد قبل از اینکه به مرورگر برسد در صفحه باشد). این خطوط را در یک فایل PHP ذخیره کرده و آن را به سرورتان آپلود کنید:
<html> <head> <meta charset="ISO-8859-5"> </head> <body> <style type="text/css">p {float: left; padding: 0 15px; margin: 0; font-size: 80%;}</style> <?php for ($i=0; $i<256; $i++) echo ($i%32?'':'<p>') . $i . ': ' . chr ($i) . '<br>'; ?> </body> </html>
کد بالا جدولی شبیه این را نمایش میدهد:
مجموعه کاراکتری سیریلیک ISO-8858-5 که در فایرفاکس به نمایش در آمده
تابع chr
در PHP کاری شبیه به همان تابع String.fromCharCode
را در جاوا اسکریپت انجام میدهد. برای مثال chr(224)
عدد ۲۲۴ را قبل از ارسال آن به مرورگر در صفحه وب، قرار میدهد. چنانکه قبلاً دیدیم ۲۲۴ میتواند به معنای چیزهای مختلفی باشد. بنابراین مرورگر نیاز دارد که بداند از کدام مجموعه کاراکتری برای نمایش ۲۲۴ استفاده کند. این چیزی است که در خط سوم کد بالا مشخص شده است. این خط به مرورگر میگوید که از مجموعه کاراکتری سیریلیک ISO-8858-5 استفاده کند:
<meta charset="ISO-8859-5">
اگر خط مربوط به مشخص کردن charset
را قرار ندهید، صفحه با استفاده از پیش فرض مرورگر به نمایش درمیآید. در کشورهای با الفبای مبتنی بر لاتین (مانند انگلستان و ایالات متحده) احتمالاً پیش فرض ISO-8859-1 است که در این صورت ۲۲۴: à است.
این وضعیت در حدود ۱۹۹۰ است. اسناد در بسیاری از زبانها میتوانند نوشته شده، ذخیره یا رد و بدل شوند اما باید بدانید که از کدام مجموعه کاراکتری در آنها استفاده شده است. همچنین هیچ راه سادهای برای استفاده دو یا بیشتر از دو الفبای غیر انگلیسی در همان سند وجود ندارد، و الفباهایی با بیشتر از ۲۵۶ کاراکتر مثل چینی و ژاپنی مجبور به استفاده از سیستمهای کاملاً متفاوتی هستند.
در نهایت اینترنت در حال ظهور است. بین المللی و جهانی شدن، این مسأله را بسیار بزرگتر مینماید. یک استاندارد جدید لازم است.
یونیکد برای نجات
در اواخر ۱۹۸۰ یک استاندارد جدید پیشنهاد شد که یک شماره منحصر به فرد (که به طور رسمی به عنوان code point شناخته میشد) را به هر حرف در هر زبان اختصاص میداد. در این روش بیشتر از ۲۵۶ مقدار مورد نیاز بود. این روش Unicode (یونیکد) نامیده شد. ورژن یونیکد هم اکنون ۶٫۱ و شامل بیش ۱۱۰۰۰۰ کد پوینت است. در صورت تمایل میتوانید همه آنها را مشاهده کنید.
۱۲۸ کد پوینت ابتدایی یونیکد همانند اَسکی هستند. محدوده ۱۲۸ تا ۲۵۵ شامل نمادهای ارز و سایر نمادهای معمول و کاراکترهای استرسدار (به عنوان کاراکترهای با علائم تشخیصی برای تلفظ [diacritical marks] شناخته میشوند) هستند، و بیشتر آن از ISO-8859-1 گرفته شدهاند. بعد از ۲۵۶، کاراکترهای استرسدار بسیار بیشتری قرار دارند. پس از ۸۸۰ به حروف یونانی میرسد، سپس سیریلیک، عبری، عربی، هندی و تایلندی. چینی، ژاپنی و کرهای از ۱۱۹۰۴ آغاز میشوند و بسیاری دیگر در این بین قرار دارند.
این مهم است که هر حرف به وسیله شماره منحصر به فرد خود نمایش داده میشود. حرف Я سیریلیکی همیشه ۱۰۷۱ و حرف α یونانی همیشه ۹۴۵ است. à همیشه ۲۲۴ و H 72 است. توجه داشته باشید که این کد پوینتهای یونیکد به طور رسمی به صورت هگزادسیمال با U+ در ابتدای آنها نوشته میشوند. بنابراین کد پوینت یونیکد H به جای ۷۲ معمولاً به صورت U+0048 نوشته میشود ( برای تبدیل هگزادسیمال [مبنای شانزده] به دسیمال [مبنای ده] : ۷۲ = ۴ * ۱۶ + ۸).
مشکل اصلی این است که بیشتر از ۲۵۶ تا از آنها وجود دارد. کاراکترهای بعد از ۲۵۶ در ۸ بیت جا نخواهند شد. هر چند یونیکد، مجموعه کاراکتری یا کد پیج نیست. بنابراین این مشکل کنسرسیوم یونیکد نیست. آنها فقط ایده را مطرح کردند و اجازه دادند تا هر کسی پیاده سازی خود را انجام دهد.
یونیکد در داخل مرورگر
یونیکد در داخل ۸ بیت یا حتی ۱۶ بیت جا نمیشود. اگرچه تنها ۱۱۰۱۱۶ کد پوینت استفاده شده، قابلیت آن را دارد تا ۱۱۱۴۱۱۲ از آنها تعریف شود که ۲۱ بیت نیاز دارد.
بهرحال کامپیوترها از سال ۱۹۷۰ پیشرفت کرده بودند و یک ریزپردازنده ۸ بیتی قدیمی شده بود. کامپیوترهای جدید اکنون پردازندههای ۶۴ بیتی دارند بنابراین چرا ما نتوانیم از یک کاراکتر ۸ بیتی به سمت یک کاراکتر ۳۲ یا ۶۴ بیت برویم؟
نخستین جواب این است : ما میتوانیم!
نرمافزارهای زیادی که با C یا ++C نوشته شدهاند از کاراکتر عریض (wide character) پشتیبانی میکنند. این یک کاراکتر ۳۲ بیتی است که wchar_t
نامیده شده است. این یک بسطی از گونه char
، ۸ بیتی C است. مرورگرهای وب مدرن از کاراکترهای عریض (یا چیزی شبیه به آن) به صورت داخلی استفاده میکنند و از لحاظ تئوری میتوانند با ۴ بیلیون کاراکتر متمایز سروکار داشته باشند. این مقدار برای یونیکد کفایت میکند بنابراین مرورگرهای وب مدرن به صورت داخلی از یونیکد استفاده میکنند.
خودتان آن را امتحان کنید
کد جاوا اسکریپت زیر شبیه کد اَسکی بالا است بجز اینکه کد زیر تا مقادیر بالاتری ادامه پیدا میکند. برای هر عدد، کد زیر به مرورگر میگوید تا کد پوینت یونیکد متناظر با آن را نمایش دهد:
<html> <body> <style type="text/css">p {float: left; padding: 0 15px; margin: 0; font-size: 80%;}</style> <script type="text/javascript"> for (var i=0; I < 2096; i++) document.writeln ((i%256?'':'<p>') + i + ': ' + String.fromCharCode (i) + '<br>'); </script> </body> </html>
نتیجه آن جدولی شبیه زیر است:
قسمتی از کد پوینتهای یونیکد که در فایرفاکس به نمایش در آمده
تصویر بالا تنها زیر مجموعهای از چند هزار کد پوینت خروجی بوسیله جاوا اسکریپت میباشد. نکته مهم این است که جاوا اسکریپت کاملاً در مرورگر وب اجرا میشود جایی که کاراکترهای ۳۲ بیتی بطور کامل قابل پذیرش است. تابع جاوا اسکریپت String.fromCharCode(1071)
کد پوینت یونیکد ۱۰۷۱ را که Я است در خروجی نشان میدهد.
به همین ترتیب اگر شما Я
را در یک صفحه HTML قرار دهید، مرورگر وب مدرن Я را نشان میدهد.
از طرف دیگر، تابع پی اچ پی chr(1071)
یک اسلش “/” را نشان میدهد به خاطر اینکه تابع chr
تنها با مقادیر ۸ بیتی (تا مقدار ۲۵۶) سروکار دارد و پس از آن خود را تکرار میکند.۴۷ = ۱۰۷۱ % ۲۵۶ که از سال ۱۹۶۰ یک “/” بوده است.
UTF-8 برای نجات
اگر مرورگرها میتوانند با کاراکترهای ۳۲ بیتی یونیکد کار کنند پس مشکل کجاست؟ مشکل در ارسال و دریافت و خواندن و نوشتن کاراکترهاست.
مشکل باقیست چون:
- بسیاری از نرمافزارها و پروتکلهای ارسال/دریافت و خواندن/نوشتن با کاراکترهای ۸ بیتی کار میکنند
- با استفاده از ۳۲ بیت برای ارسال/ذخیره متن انگلیسی مقدار پهنای باند/فضای موردنیاز چهار برابر خواهد شد
هر چند مرورگرها میتوانند بصورت داخلی با یونیکد کار کنند، هنوز باید برای مرورگر وب داده را از وب سرور بگیرید و دوباره برگردانید، و نیاز دارید تا آن را در یک فایل یا جایی در یک پایگاه داده ذخیره کنید. بنابراین هنوز به راهی نیاز دارید که ۱۱۰۰۰۰ کد پوینت یونیکد را تنها در ۸ بیت جا دهید.
تلاشهای مختلفی برای حل این مسأله انجام گرفته مثل UCS2 و UTF-16. اما در سالهای اخیر UTF-8 برنده بوده است که مخفف فرمت ۸ بیتی انتقال مجموعه کاراکتری جهانی (Universal Character Set Transformation Format 8 bit) است.
UTF-8 باهوش است و نسبتاً شبیه کلید Shift روی کیبورد کار میکند. به طور معمول هنگامی که شما H را از کیبورد میفشارید حرف کوچک h روی صفحه ظاهر میشود. اما اگر شما ابتدا Shift را فشار داده باشید، حرف بزرگ H ظاهر میشود.
UTF-8 با اعداد ۰ تا ۱۲۷ همانند اَسکی، ۱۹۲ تا ۲۴۷ به عنوان کلیدهای Shift و ۱۲۸ تا ۱۹۲ به عنوان کلیدهایی که با شیفت استفاده میشوند، رفتار میکند. برای مثال کاراکترهای ۲۰۸ و ۲۰۹ شما را به محدوده سیریلیک منتقل میکنند (شیفت میدهند). ۲۰۸ همراه با ۱۷۵ کاراکتر ۱۰۷۱ است که Я سیریلیک میشود. محاسبه دقیق آن به این صورت است: ۱۰۷۱ = (۶۴ % ۱۷۵) + ۶۴ * (۳۲ % ۲۰۸). کاراکترهای ۲۲۴ تا ۲۳۹ شبیه شیفت مضاعف (double shift) هستند. ۲۲۶ به دنبال آن ۱۹۰ و سپس ۱۲۸ کاراکتر ۱۲۱۶۰: ⾀ است. ۲۴۰ به بالا شیفت سه گانه (triple shift) است.
بنابراین UTF-8 یک رمزگذاری با عرض متغیر (variable-width) چند بایتی (multi-byte) است. چند بایتی به خاطر اینکه یک کاراکتر واحد شبیه Я بیشتر از یک بایت را برای مشخص شدن میگیرد. عرض متغیر به این دلیل که برخی از کاراکترها مثل H تنها یک بایت را میگیرند و برخی تا چهار بایت را اشغال میکنند.
بهتر از همه این است که با ASCII نیز سازگار است. بر خلاف برخی دیگر از راه حلهای پیشنهادی، هر سندی که تنها در ASCII با کاراکترهای ۰ تا ۱۲۷ نوشته شده کاملاً در UTF-8 معتبر است و همچنین موجب صرفه جویی در پهنای باند میشود.
خودتان آن را امتحان کنید
این یک تجربه متفاوت است. PHP شش عدد ۷۲، ۲۰۸، ۱۷۵، ۲۲۶، ۱۹۰ و ۱۲۸ را درون یک صفحه HTML قرار میدهد. مرورگر آن اعداد را به عنوان UTF-8 تفسیر میکند و به صورت داخلی آنها را به کد پوینتهای یونیکد تبدیل میکند. سپس جاوا اسکریپت مقادیر یونیکد را به خروجی میفرستد. سعی کنید charset را از UTF-8 به ISO-8859-1 تغییر دهید و ببینید چه اتفاقی میافتد:
<html> <head> <meta charset="UTF-8"> </head> <body> <p>Characters embedded in the page:<br> <span id="chars"><?php echo chr(72).chr(208).chr(175).chr(226).chr(190).chr(128); ?></span> <p>Character values according to Javascript:<br> <script type="text/javascript"> function ShowCharacters (s) { var r=''; for (var i=0; i<s.length; i++) r += s.charCodeAt (i) + ': ' + s.substr (i, 1) + '<br>'; return r; } document.writeln (ShowCharacters (document.getElementById('chars').innerHTML)); </script> </body> </html>
چیزی که مشاهده میکنید به این شکل است:
مجموعه کاراکتری UTF-8
مجموعه کاراکتری ISO-8859-1
اگر صفحه را با استفاده از مجموعه کاراکتری UTF-8 مشاهده کنید، تنها سه کاراکتر: HЯ⾀ را خواهید دید. اگر آن را با مجموعه کاراکتری ISO-8859-1 مشاهده کنید شش کاراکتر جداگانه: €¾HЯâ را خواهید دید. این چیزی است که اتفاق میافتد:
- در وب سرور، PHP اعداد ۷۲، ۲۰۸، ۱۷۵، ۲۲۶، ۱۹۰ و ۱۲۸ را درون صفحه وب قرار میدهد.
- صفحه وب از طریق اینترنت از وب سرور به مرورگر شما میرسد.
- مرورگر آن اعداد را دریافت و آن را بر اساس مجموعه کاراکتری تفسیر میکند.
- مرورگر به صورت داخلی کاراکترها را با استفاده از مقادیر یونیکد نمایش میدهد.
- جاوا اسکریپت مقادیر یونیکد را به مقادیر مجموعه کاراکتری یاد شده متناظر میکند و آنها را به خروجی میفرستد.
توجه داشته باشید زمانی که پنج عدد ۷۲، ۲۰۸، ۱۷۵، ۲۲۶، ۱۹۰ به عنوان ISO-8859-1 مشاهده شوند با کد پوینتهای یونیکدشان یکسان هستند. این بدین خاطر است که در این محدوده یونیکد به شدت از ISO-8859-1 اقتباس کرده است. بهر حال آخرین عدد که سمبل € است متفاوت است. این سمبل در ISO-8859-1 در مکان ۱۲۸ است و در یونیکد مقدار ۸۳۶۴ را دارد.
خلاصهای از حدود سالهای ۲۰۰۳
UTF-8 در حال تبدیل شدن به محبوبترین مجموعه کاراکتری بین المللی بر روی اینترنت و جانشینی مجموعههای تک بایتی (single-byte) مانند ISO-8859-5 است. هنگامی که شما یک سند غیر انگلیسی زبان را مشاهده یا ارسال میکنید، هنوز هم نیاز به دانستن این داریدکه آن سند از چه مجموعه کاراکتری استفاده میکند. برای بیشترین قابلیت همکاری، مدیران وب سایتها نیاز دارند تا مطمئن شوند که همه صفحات وبشان از مجموعههای کاراکتری UTF-8 استفاده میکنند.
شاید Ð آشنا به نظر برسد. این کاراکتر گاهی نمایش داده میشود اگر شما سعی کنید تا سندهای UTF-8 زبان روسی را مشاهده کنید. بخش بعدی شرح میدهد که چگونه مجموعههای کاراکتری با هم اشتباه گرفته میشوند و در نهایت همه چیز را به اشتباه در یک پایگاه داده ذخیره میکنند.
بسیاری از مشکلات
تا زمانی که همه در حال صحبت کردن درباره UTF-8 هستند، همه باید بدون مشکل کار کنند. اگر اینگونه نباشد کاراکترها میتوانند خرد شوند. برای توضیح این کار، یک نمونهی تعاملیِ یک وب سایت را تصور کنید که همچون یک کاربر، نظری (comment) را در یک پست وبلاگ میگذارید.
- صفحه وب یک فرم نظر خواهی را نمایش میدهد
- کاربر یک نظر را تایپ میکند و دکمه submit را فشار میدهد
- آن نظر به سرور فرستاده شده و در پایگاه داده ذخیره شده است
- نظر بعداً از پایگاه داده بازیابی شده و در یک صفحه وب به نمایش در آمده است
این فرایند ساده میتواند به طرق مختلف دچار اشکال شود و انواع مشکلات زیر را ایجاد نماید:
HTML ENTITIES
برای لحظهای وانمود کنید که چیزی در مورد مجموعههای کاراکتری نمیدانید. فرم در وبلاگتان احتمالاً خود را با استفاده از مجموعه کاراکتری ISO-8859-1 نشان میدهد. این مجموعه کاراکتری، هیچگونه روسی یا تایلندی یا چینی نمیشناسد و تنها مقدار کمی یونانی را میشناسد. اگر شما تلاش کنید تا چیزی را از فرم copy و paste کنید و دکمه submit را فشار دهید، یک مرورگر مدرن سعی خواهد کرد آن را به entityهای عددی HTML مثل Я
برای کاراکتر Я تبدیل کند.
این چیزی است که در پایگاه داده شما ذخیره میشود و این چیزی است که هنگام نمایش یک نظر (comment) در خروجی ظاهر میشود. بدین معنی که آن نظر، در صفحه وب به درستی نمایش داده میشود اما زمانی که شما سعی کنید آن را به یک فایل PDF یا ایمیل بفرستید یا جستجوهای متنی را در پایگاه داده برای یافتن آن اجرا کنید، مشکلاتی رخ میدهد.
کاراکترهای درهم (confused characters)
چه خواهد شد اگر شما با یک وب سایت روسی کار کنید و یک مجموعه کاراکتری معین در صفحه وبتان نداشته باشید؟ یک کاربر روسی را که مجموعه کاراکتری پیش فرضش ISO-8859-5 است در نظر بگیرید. برای گفتن “hi” او ممکن است Привет را تایپ کند. وقتی کاربر دکمه Submit را فشار میدهد، کاراکترها بر اساس مجموعه کاراکتری صفحه فرستاده شده، کدگذاری (encode) میشوند. در این مورد، Привет به صورت اعداد ۱۹۱، ۲۲۴، ۲۱۶، ۲۱۰، ۲۱۳ و ۲۲۶ کدگذاری میشود. این اعداد از طریق اینترنت به سرور فرستاده شده و به همین صورت در پایگاه داده ذخیره میشوند.
اگر بعداً کسی آن نظر (comment) را با استفاده از ISO-8859-5 مشاهده کند، متن را به درستی خواهد دید. اما اگر آن را با مجموعه کاراکتری دیگری مثل Windows-1251 ببیند، їаШТХв را مشاهده خواهد کرد. این متن هنوز روسی است اما معنی درست را نمیرساند و هیچ حسی ایجاد نمیکند.
کاراکترهای استرسدار (accented: علامت تکیهی صدا [بدین شکل’]) با تعداد زیادی از حروف صدادار (:vowel حروف a، e، i، o، u و گاهی y)
اگر شخصی همان کامنت را با استفاده از ISO-8859-1 مشاهده کند، ¿àØÒÕâ را به جای Привет خواهد دید. یک عبارت طولانیتر شبیه Я тоже рада Вас видеть (“nice to see you” به شکل رسمی خطاب به یک خانم) وقتی با ISO-8859-5 کدگذاری شود در مجموعه کاراکتری ISO-8859-1 اینگونه نشان داده میشود: Ï âÞÖÕ àÐÔÐ. این بدین علت است که محدوده ۱۲۸ تا ۲۵۵ در ISO-8859-1 شامل تعداد زیادی از حروف صدا دار با استرسها (accent) هستند.
بنابراین اگر شما این نوع الگو را مشاهده میکنید، احتمالاً بدین خاطر است که متن با یکی از مجموعههای کاراکتری تک بایتی (single byte) (یکی از ISO-8859ها مثلاً ISO-8859-5 یا یکی از Windowsها مثلاً Windows-1251) وارد شده است و در حال حاضر با ISO-8859-1 به نمایش در آمده است. برای درست کردن متن احتیاج دارید که تعیین کنید که متن با کدام مجموعه کاراکتری وارد شده و به جای آن، متن را با UTF-8 وارد کنید.
کاراکترهای استرسدارِ تبدیل (alternating)
اگر کاربر کامنت را در UTF-8 ارائه کند چه اتفاقی میافتد؟ در آن صورت کاراکترهای سیریلیک که کلمه Привет را تشکیل میدهند هر کدام به صورت ۲ عدد فرستاده میشوند: ۲۰۸/۱۵۹، ۲۰۹/۱۲۸، ۲۰۸/۱۸۴، ۲۰۸/۱۷۸، ۲۰۸/۱۸۱ و ۲۰۹/۱۳۰٫ اگر آن را تحت ISO-8859-1 مشاهده کنید شبیه این دیده میشود: Привет.
به کاراکترهای Ð و Ñ توجه کنید. این کاراکترها شمارههای ۲۰۸ و ۲۰۹ هستند و به UTF-8 میگویند تا به محدوده سیریلیک سوییچ کند. بنابراین اگر شما تعداد زیادی Ð و Ñ میبینید، میتوانید فرض کنید که در حال نگاه کردن به یک متن روسی هستید که در UTF-8 وارد شده و با ISO-8859-1 دیده میشود. به طور مشابه، یونانی تعداد زیادی Î و Ï، ۲۰۶ و ۲۰۷ را خواهد داشت. و عبری، کاراکتر تبدیل × به شماره ۲۱۵ را دارد.
حروف صدا دار قبل از علامت پوند و کپی رایت
یک موضوع رایج در بریتانیا علامت پول پوند (£) است که به £ تبدیل میشود. این دقیقاً همان مسالهای است که در بالا پیش آمد. مقدار سمبل £ در یونیکد و ISO-8859-1، ۱۶۳ است. به یاد بیاورید که در UTF-8 هر کاراکتر بیشتر از ۱۲۷ به وسیله توالی دو یا بیشتر از اعداد نشان داده میشود. در این مورد، توالی UTF-8، ۱۹۴/۱۶۳ است. دلیل ریاضی آن این است که : ۱۶۳ = (۶۴ % ۱۶۳) + ۶۴ * (۳۲ % ۱۹۴).
از لحاظ دیداری این بدین معنی است که اگر شما توالی UTF-8 را با استفاده از ISO-8859-1 مشاهده کنید، یک Â نمایان میشود که کاراکتر ۱۹۴ در ISO-8859-1 است. این همان چیزی است که برای همه کد پوینتهای ۱۶۱ تا ۱۹۱ یونیکد اتفاق میافتد که شامل © و ® و ¥ میشود.
پس اگر در کنار کاراکترهای £ یا © ناگهان یک Â را ظاهر شد به خاطر این است که آنها به عنوان UTF-8 وارد شدهاند.
علامتهای سوال داخل لوزیهای سیاه
اگر Привет را به عنوان ISO-8859-5 وارد کنید به عنوان اعدادی که در بالا ذکر شد ذخیره خواهد شد: ۱۹۱، ۲۲۴ و غیره. اگر بعداً سعی کنید این را تحت UTF-8 ببینید ممکن است تعدادی علامت سوال داخل لوزیهای سیاه ببینید: �. مرورگر زمانی اینها را نشان میدهد که نمیتواند مفهوم اعدادی را که در حال خواندنشان است، دریابد.
UTF-8 خود-همگامساز (self-synchronizing) است. بر خلاف دیگر رمزگذاریهای کاراکتری چند بایتی، با UTF-8 همیشه میدانید که در چه موقعیتی قرار دارید. اگر یک عدد ۱۹۲-۲۴۷ را ببینید شما میفهمید در ابتدای یک توالی چند بایتی قرار دارید. اگر ۱۲۸-۱۹۱ را ببینید، میفهمید که در میانه یکی از آنها قرار دارید.
هیچ خطری در از دست دادن عدد اول و تحریف (garbling) بقیه متن وجود ندارد. به این معنی که در UTF-8، توالی ۱۹۱ و پس از آن ۲۲۴ هرگز به طور طبیعی رخ نخواهد داد، بنابراین مرورگر نمیداند با این چه کند و در عوض �� را نشان میدهد.
این همچنین میتواند باعث مشکلات مربوط به £ و © شود. £۵۰در ISO-8859-1 اعداد ۱۶۳، ۵۳ و ۴۸ است. ۵۳ و ۴۸ هیچ مسالهای ایجاد نمیکنند اما در UTF-8، ۱۶۳ هرگز به خودی خود اتفاق نمیافتد بنابراین به شکل �۵۰ نشان داده میشود. بطور مشابه اگر �۲۰۱۲ را ببینید احتمالاً به خاطر این است که ©۲۰۱۲ به عنوان ISO-8859-1 وارد شده اما به عنوان UTF-8 نشان داده شده است.
جاهای خالی (blank)، علامتهای سوال و جعبهها
با وجود اینکه UTF-8 و یونیکد کاملاً سودمند و موثر هستند، یک مرورگر هنوز ممکن است نداند که چگونه یک کاراکتر را نمایش دهد. چند کاراکتر ابتدایی ASCII 1 تا ۳۱ بیشتر توالیهایی برای کنترل teleprinterها (چیزهایی مثل تایید و توقف) هستند. اگر سعی در نشان دادن آنها کنید، یک مرورگر ممکن است یک ? یا یک جای خالی یا یک جعبه با اعداد ریز داخل آن را نشان دهد.
همچنین یونیکد بیش از ۱۱۰۰۰۰ کاراکتر را تعریف میکند. مرورگر شما ممکن است فونت صحیح برای نمایش همه آنها را نداشته باشد. شماری از کاراکترهای نامفهومتر ممکن است به عنوان ? یا جای خالی یا یک جعبه کوچک به نمایش درآید. مرورگرهای قدیمی، ممکن است حتی کاراکترهای نسبتاً شایع غیر انگلیسی را به عنوان جعبه نشان دهند.
مرورگرهای قدیمی همچنین ممکن است بیشتر اوقات برای برخی موارد فوق نظیر نمایش ?، جاهای خالی و جعبهها متفاوت رفتار کنند.
پایگاه دادهها
بحث بالا از مرحله میانی از فرایند ذخیره داده در پایگاه داده خودداری کرده است. پایگاه دادههایی مثل MySQL نیز میتوانند یک مجموعه کاراکتری را برای یک پایگاه داده، جدول یا ستون مشخص کنند. اما این از مЬموعههای کاراکتری صفحات وب اهمیت کمتری دارد.
هنگام ذخیره و بازیابی داده، MySQL تنها با اعداد سروکار دارد. اگر به آن بگویید عدد ۱۶۳ را ذخیره کند، ذخیره خواهد شد. اگر ۲۰۸/۱۵۹ را به آن بدهید MySQL هر دوی آن اعداد را ذخیره خواهد کرد. و هنگام بازیابی داده، شما همان دو عدد را دریافت میکنید.
هنگامی که شما از توابع پایگاه داده برای مقایسه، تبدیل و اندازهگیری داده استفاده میکنید، مجموعه کاراکتری مهمتر میشود. برای مثال LENGTH طول یک فیلد به مجموعه کاراکتریاش وابسته است، و همچنین مقایسههای رشتهای با استفاده از LIKE و = . متدی که برای مقایسه رشتهها استفاده میشود collation نام دارد.
مجموعههای کاراکتری و مقایسه (collation)ها در MySQL یک موضوع جامع است. این به سادگیِ یک مورد از تغییر مجموعه کاراکتری یک جدول به UTF-8 نیست. بیشتر دستورات SQL اطمینان از اینکه داده در فرمت مناسب نیز وارد و خارج میشود را در نظر میگیرند. این وبلاگنقطه شروع خوبی است.
خودتان آن را امتحان کنید
کد PHP و جاوا اسکرسپت زیر به شما اجازه میدهد تا تمام این موضوعات را امتحان کنید. میتوانید مشخص کنید که کدام مجموعه کاراکتری برای ورود و خروج متن مورد استفاده قرار میگیرد، و همچنین میتوانید ببینید که مرورگر در مورد آن چه فکر میکند.
<?php $charset = $_POST['charset']; if (!$charset) $charset = 'ISO-8859-1'; $string = $_POST['string']; if ($string) { echo '<p>This is what PHP thinks you entered:<br>'; for ($i=0; $i<strlen($string); $i++) {$c=substr ($string,$i,1); echo ord ($c).': '.$c.' <br/>';} } ?> <html> <head> <meta charset="<?=$charset?>"> </head> <body> <form method="post"> <input name="lastcharset" type="hidden" value="<?php echo $charset?>"/> Form was submitted as: <?php echo $_POST['lastcharset']?><br/> Text is displayed as: <?php echo $charset?><br/> Text will be submitted as: <?php echo $charset?><br/> Copy and paste or type here: <input name="string" type="text" size="20" value="<?php echo $string?>"/><br/> Next page will display as: <select name="charset"><option>ISO-8859-1<option>ISO-8859-5 <option>Windows-1251<option>ISO-8859-7<option>UTF-8</select><br/> <input type="submit" value="Submit" onclick="ShowCharacters (this.form.string.value); return 1;"/> </form> <script type="text/javascript"> function ShowCharacters (s) { var r='You entered:'; for (var i=0; i<s.length; i++) r += '\n' + s.charCodeAt (i) + ': ' + s.substr (i, 1); alert (r); } </script> </body> </html>
این مثالی از یک کد به صورت عملی است. اعداد در بالا مقادیر عددی از هر یک از کاراکترها و نمایششان (وقتی به صورت تکی دیده میشوند) در مجموعه کاراکتری جاری هستند:
نمونهای از ورودی و خروجی در مجموعههای کاراکتری متفاوت. این شکل یک علامت £ را نشان میدهد که در گوگل کروم به یک � تغییر میکند.
صفحه بالا گذشته، حال و آینده مجموعههای کاراکتری را نشان میدهد. میتوانید از این کد استفاده کنید تا سریعاً ببینید چگونه متن از هم تفکیک میشود. برای مثال اگر در شکل بالا دوباره Submit را فشار دهید، � دارای کد پوینتِ یونیکد ۶۵۵۳۳ است که معادل ۲۳۹/۱۹۱/۱۸۹ در UTF-8 است و به صورت �۵۰ در ISO-8859-1 نشان داده میشود. بنابراین اگر همیشه نمادهای £ شما تبدیل به � میشود، به خاطر مسیر و روشی است که از آن طریق دریافت شدهاند.
توجه داشته باشید که در کد بالا select box که در پایین صفحه قرار گرفته در هر بار تغییر دوباره مقدارش به ISO-8859-1 باز میگردد.
یک راه حل
تمام مشکلات رمزگذاری بالا به این خاطر است که متن در یک مجموعه کاراکتری ثبت میشود و در مجموعه کاراکتری دیگری مشاهده میشود. راه حل این است که اطمینان حاصل کنید هر صفحه در وب سایتتان از UTF-8 استفاده میکند. میتوانید این کار را با یکی از خطوط زیر که بلافاصله پس از تگ head میآید، انجام دهید
<meta charset="UTF-8"> <meta http-equiv="Content-type" content="text/html; charset=UTF-8">
این کد باید یکی از اولین چیزها در صفحه وبتان باشد، به این دلیل که باعث خواهد شد مرورگر تمامِ صفحه را بازبینی کند. به خاطر سرعت و کارایی، مرورگر باید این کار را در سریعترین زمان ممکن انجام دهد.
همچنین میتوانید UTF-8 را در جدولهای MySQL مشخص کنید، هر چند برای استفاده کامل از این ویژگی، نیاز به جستجوی بیشتر در این باره دارید.
توجه داشته باشید که کاربران هنوز میتوانند مجموعه کاراکتری را در مرورگرهایشان نادیده بگیرند. این موضوع نادر است اما به این معنا است که این راه حلی تضمین شده نیست. برای امنیت بیشتر، میتوانید در مرحله پایانی یک بررسی را برای اطمینان از اینکه داده به شکل صحیح وارد شده است انجام دهید.
وب سایتهای موجود
اگر وب سایت شما پیش از این متن را به زبانهای گوناگون جمع آوری میکرده پس نیاز به تبدیل داده موجود به UTF-8 خواهید داشت. اگر در سایت شما متنهایی با زبانهای مختلف وجود ندارد میتوانید از یک صفحه PHP شبیه همانی که در بالا آمد برای تعیین مجموعه کاراکتری اصلی استفاده کنید و از مرورگر برای تبدیل داده به UTF-8 استفاده کنید.
اگر مقدار زیادی داده در مجموعههای کاراکتری مختلف داشته باشید، نیاز دارید تا ابتدا مجموعه کاراکتری را پیدا کنید و سپس آن را تبدیل نمایید. در PHP میتوانید از mb_detect_encoding
برای پیدا کردن و از iconv
برای تبدیل استفاده کنید. هنگام خواندن توضیحات mb_detect_encoding
به نظر میرسد کاملاً تابع سختگیری است تا مطمئن شود که شما از آن درست استفاده میکنید و نتایج صحیحی میگیرید.
تابع utf8_decode ممکن است گمراه کننده باشد. این تابع UTF-8 را به ISO-8859-1 تبدیل میکند. هر کاراکتری که در ISO-8859-1 موجود نیست (مثل سیریلیک، یونانی، تایلندی و نظایر اینها) به علامت سوال تبدیل میشوند. این گمراه کننده است به دلیل اینکه ممکن است شما انتظار بیشتری را از این تابع داشته باشید اما بهتر از این نمیتواند کاری انجام دهد.
خلاصه
این نوشته به شدت بر روی اعداد تکیه کرده و سعی کرده تا همه امکانات را به کار بگیرد. امیدوارم درک جامعی از مجموعههای کاراکتری، یونیکد، UTF-8 و مشکلات مختلفی که میتوانند به وجود آیند را فراهم کرده باشد. مفاهیم داستان عبارتند از:
- شما به منظور درک متن غیر لاتین نیاز به شناخت مجموعه کاراکتری دارید
- به صورت داخلی، مرورگرها از یونیکد برای نمایش کاراکترها استفاده میکنند
- اطمینان حاصل کنید که همه صفحههای وبتان UTF-8 را به عنوان مجموعه کاراکتری مشخص کردهاند
برای رویکردی متفاوتی به این موضوع، این مقاله ۲۰۰۳ درباره مجموعه کاراکتری عالی است. با تشکر از شما برای همراهیتان با این سفر حماسی.
در انتها لینک چند سایت مفید برای یونیکد:
یونیکد تصویری : http://unicodinator.com/
سایتی برای کاراکترهای ♥، اعداد و علائم نقطه گذاری: http://graphemica.com/
کاوش یونیکد: http://unicode.martinleopold.com/
منبع:
http://coding.smashingmagazine.com/2012/06/06/all-about-unicode-utf8-character-sets/
امیدوارم ترجمه این مقاله برای عزیزان مفید بوده و توانسته باشد به پاسخهایتان درباره یونیکد و مجموعههای کاراکتری که معمولاً اطلاعات کمتری درباره آنها به زبان پارسی منتشر شده است، جواب بدهد. در ترجمه اصطلاحات و کلمات دشوارتر و نامأنوستر سعی شده بهترین معادل آنها که با متن هماهنگی لازم را داشته باشد بکار گرفته شود و خود عبارت انگلیسی هم داخل پرانتز ذکر شده تا خواننده متوجه شود که ترجمه ذکر شده مربوط به چه عبارتی است. باعث خوشحالی خواهد بود که ما را از نظرات خوب و سازنده خود محروم نفرمایید و اگر مطلب یا بحث تکمیلی در این باره دارید یا ترجمههای مناسبتری در مورد عبارات گفته شده به ذهن شما میرسد در بخش نظرات مطرح نمایید.
علیرضا اسکندرپور شوفری
9 دسامبر 2012
خیلی طولانیه و من نخوندم. ولی همین که دیدم یه همچین مقاله سنگینی رو ترجمه کردید وظیفه خودم دونستم ازتون تشکر کنم. حتما در آینده کسانی مقاله شما را در موتور جستجویی جستجو خواهند کرد و بخاطر تکمیل بودنش در نتایج اول نمایش داده خواهد شد. پیروز باشید.
هادی
13 نوامبر 2014
الان که این رو من سرچ کردم نتیجه دوم گوگل بود!
جالب بود
مهدی خاکسار
9 دسامبر 2012
مفید بود خسته نباشید
راوندی
9 دسامبر 2012
خوب بود خوشمان آمد.
فرشاد
9 دسامبر 2012
خیلی خوب.
موفق باشید.
مهدی
9 دسامبر 2012
مقاله خوبی بود . تشکر میکنم .
اما بعضی از متغیرها و عبارت های ریاضی وارد شده بر عکس ظاهر شده اند .
سوران خضری
11 دسامبر 2012
ایرادتون کاملا صحیحه متشکرم
سعی میکنیم این ایرادات رو برطرف کنیم
محسن
10 دسامبر 2012
سلام
خیلی مفید بود.کلا مقاله خوب در مورد یونیکد به فارسی خیلی کم هست و خیلی ها اطلاعی در مورد اینکه اصلا یونیکد چی هست رو ندارند!
ممنون از شما.
saeed
10 دسامبر 2012
سلام
من می خواستم بدونم چگونه یک فونت فارسی را به وب سایتم پیوست کنم(یعنی یک فونت در کامپیوترم دارم و می خواهم آن فونت را، فونت مطالبم در سایتم قرار دهم تا همه همان را ببینند).
لطفا اگر امکانش هست جواب دهید.
سوران خضری
11 دسامبر 2012
با جستجوی مطالب فارسی و انگلیسی می توانید به سادگی جواب سوالتون رو پیدا کنید اما من برای شما چند لینک زیر رو برای نمونه میگذارم امیدوارم که جوابتون رو بگیرید:
http://www.wedesign.ir/css/css3-font-face-methods-and-optimized-font-firefox6
http://www.pcfors.com/PCF/PRO/Webmasters_Tool/Farsi_Font/01_Font_Face.htm
http://webgoo.ir/121/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D9%81%D9%88%D9%86%D8%AA-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C-%D8%AF%D8%B1-%D9%88%D8%A8-%D8%A8%D8%A7-css
http://weapi.org/fa/articles/3-woff-farsi-fonts
http://www.jentelman.com/blog/1390/11/29/%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D9%81%D9%88%D9%86%D8%AA-%D9%87%D8%A7%DB%8C-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C-%D8%AF%D8%B1-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D8%B3%D8%A7%DB%8C%D8%AA/
http://www.ifont.ir
هادی
11 دسامبر 2012
سلام
اینجا رو ببینید
http://www.wedesign.ir/css/css3-font-face-methods-and-optimized-font-firefox6
آرش
10 دسامبر 2012
جامع و عالی بود . تشکر.
jimmyheller
10 دسامبر 2012
بسیار فوق العاده بود! :)
فراهانی
10 دسامبر 2012
سپاسگذارم
ahmd
10 دسامبر 2012
مرسی، واقعا مقاله مفید و جامعی بود و خیلی استفاده بردم. موفق باشید.
علیرضا
11 دسامبر 2012
مقالهای کامل و عالی بود. با سپاس
ramin
16 دسامبر 2012
سلام
دوست عزیز تشکر میکنم از این ترجمه زیبا و مقاله بسیار مفیدی که برای ترجمه انتخاب کردین.
یک پیشنهاد دارم:
لطفا این گونه مقالات رو به همراه فایل pdf بگذارید تا افرادی که مثل من میخوان پرینت بگیرن و بخونن دچار مشکل نشن.
رضا
16 دسامبر 2012
سلام مرسی از مقاله خوبت خیلی خیلی خوب بود.
احمد
20 دسامبر 2012
دستتون درد نکنه جامع و کامل و بسیار مفید بود.
سوران خضری
20 دسامبر 2012
احمد عزیز خوشحالم که براتون مفید بوده
TheMilad
2 ژانویه 2013
واقعا ممنون.
سومی
5 فوریه 2013
بسیار عالی و مفید بود ممنون
سوران خضری
6 فوریه 2013
سپاس از حسن توجهتون
محمد جواد
5 مارس 2013
واقعا مطلب عالی و مفیدی بود
با تشکر
مانی رضویزاده
8 مارس 2013
عالی بود :)
—
یک نکته اصلاحی: در ماشین حساب ویندوز ۷ دکمه Bin در قسمت Programmer قرار داره نه Scientific :)
شاد باشید و پایدار.
سوران خضري
9 مارس 2013
با سپاس از شما برای اینکه وقت گذاشتین و ایرادی که به نظرتون رسیده رو تذکر دادین
منظور من ماشین حساب ویندوز XP بود. در XP به همون صورتی هست که در مقاله ذکر شده
پاینده و سرفراز باشید
حمید گنجی
26 آوریل 2013
عالی بود.
حمید تنهایی
11 می 2013
سلام.
خیلی خیلی ممنونم. خیلی مطلب مهم و مفیدی بود. برای اینکه طولانی بود ۶ ماهه لینکش رو نگه داشتم تا بخونم الانم تا وسطاش خوندم بقیش هم ایشالا یه موقعیت دیگه می خونم.
باز هم تشکر می کنم به خاطر اینکه به این مقوله مهم پرداختید.
سوران خضري
12 می 2013
با سپاس از شما
خوشحالم که مورد پسند واقع شده
testdl.ir
16 ژوئن 2013
با سلام و عرض ادب
نمیدونم سوالم چقدر ایتدایی هست ولی الان یه ساعت هست دارم دور خودم توی اسن سایت ها می چرخم ببینم این فرمتش چی هست ؛ گرفتار شدم
http://webgoo.ir/121/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D9%81%D9%88%D9%86%D8%AA-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C-%D8%AF%D8%B1-%D9%88%D8%A8-%D8%A8%D8%A7
الان این کارکترهایی که با درصد شروع میشن چی هستن؟
ممنون اگر یه راهنمایی کنید
سوران خضري
18 ژوئن 2013
سلام
راستش اصلا متوجه سوالتون نشدم
اگر دقیق تر بپرسین شاید بتونم راهنمایی کنم
افشین
22 جولای 2013
سلام. سپاس از اینکه این موضوع مفید و کاربردی را که فکر کنم خیلی ها در موردش اطلاعات کافی ندارند ترجمه کردین و به اشتراک گذاشتین. من الان چند ساله برنامه نویسی میکنم و تقریبا همیشه با این موضوع درگیر بودم و از خیلی برنامه نویسهای دیگه هم که میپرسی اطلاعات نسبتا مختصری راجع به این موضوع دارند.
باز هم سپاس
سوران خضري
23 جولای 2013
سلام جناب افشین
بسیار خرسندم که این مطلب براتون مفید بوده و مورد توجه شما واقع شده
با سپاس از شما
p-soori
26 جولای 2013
با سلام
چند وقت است که پیغامهای ویندوز سون بخصوص شیغامهای روز idm با حروفی مثل Ñ -ä- نمایش داده میشود
ممنون میشوم که راه درست کردن آنرا ایمیل بفرمائید
p-soori
26 جولای 2013
با سلام
بعصی از پیغامهای ویندوز ۷ بخصوص idm بصورت حروفی مثل
Ñ –Ñä – نمایش داده میشود لطفا راهنمائی نمائید
مینا اصغری
19 نوامبر 2013
با سلام و خسته نباشید….
لطفا کمکم کنید…. من یک متن خیلی بزرگ را در کامپیوتر ذخیره کردم و درواقع حالت آن را txt گذاشتم ….بعد آنرا با کابل وارد موبایل کردم اما وقتی خواستم در موبایل بخوانم تنها قسمتهای انگلیسی قابل خواندن بود و قسمتهای فارسی به شکل unicode بود….نمیدانم چه کار باید کنم…اینکه آن متن را در گوشی داشته باشم خیلی برایم مهم است.
خالد
16 دسامبر 2013
باسلام-ایا برنامه ای هست که بتوان این کدها رو رمز گشایی کرد؟
محمد
19 ژانویه 2014
سلام من یه مشکل دارم لطفا اکه میتونید کمکم کنید
مشکل من اینه که ویندوز من ۷ است. من میخوام ایملهای چند سال پیش رو مشاهده کنم ولی متن اون ایملهایی که فارسی بوده ودریافت کردم به ریخته. وقتی راست کلایک روی متن میکنم که گزینه view و encoding و سپس UTF-8رو انتخاب کنم همپین پیزی توی راست کلیک روی متن به ریخته نمی بینم لطفا کمک کنید پطوری این ایمیل ها رو دوباره ببینم. بسیار سپاسگذارم
شیوا
16 فوریه 2014
سلام ممنون خیلی کمک کردید.فقط ممکنه تو یک خلاصه کوتاه تفاوت کد اسکی و یونی کد را واضح بگید؟ممنون
امیر
15 مارس 2014
سلام
خیلی خیلی کامل بود واقعا زحمت کشیدین دستتون درد نکنه
تشکر تشکر تشکر …………………………………………
محمد
13 آوریل 2014
عالی بود . ممنونم بابت زحمتی که کشیدید
سوران خضری
17 آوریل 2014
ممنون از شما بابت اظهار لطفتون. خوشحالم مفید بوده
مهدی تمدن
27 می 2014
سلام
ببخشید من یه مشکل دارم
کد یو تی اف و … رو تو کد قرار می دم و زمانی که از دستور پرینت برای نمایش متن فارسی که در یک متغیر به صورت مستقیم در php مقدار دهی شده رو چاپ میکنم مشکلی ندارم و فارسی نشون میده
زمانی که یه مطلبی روبه mysql می فرستم هم مشکلی نیست و با phpmyadmin درست نشون میده
اما زمانی که همون مطلب داخل mysql رو به php منتقل می کنم و نمایش میدم حروف فارسی نشون نمی ده و بجاش حروفی مثل رومی یا روسی (دقیق نمیدونم ) نشون می ده
به هرکس میگم جواب درستی بهم نمیده!
یه کد هم بود که برای دریافت داده از mysql با utf8 بود اما بازم مشکل رو حل نکرد!
واقعا درام دیوونه میشم!
کمک کنید
سوران خضری
4 ژوئن 2014
سلام دوست گرامی
این ۳ تا لینک رو مطالعه بفرمایید امیدوارم پاسختون رو بگیرید:
http://forum.majidonline.com/threads/93747-%DA%86%D9%86%D8%AA%D8%A7-%D8%B3%D9%88%D8%A7%D9%84-Php-(-%D9%81%D9%88%D8%B1%DB%8C-)#2
http://barnamenevis.org/showthread.php?120420-%D9%86%D9%88%D8%B4%D8%AA%D9%86-%D9%88-%D8%AE%D9%88%D8%A7%D9%86%D8%AF%D9%86-%D9%85%D8%AA%D9%86-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C-%D8%AF%D8%B1-mysql-%D8%AA%D9%88%D8%B3%D8%B7-php
http://www.mojsazan.com/forum/showthread.php?tid=2036
سعیدی
22 جولای 2014
سلام
من جستجو مستقیم از پایگاه داده را از طریق sms پیاده سازی کرده ام مشکل اصلی من هنگامی که متن پیام به سامانه ارسال می شود هنگام جستجو کارکتر ‘ی’را پردازش نمی کند برای مثال
اگر من خیابان را برفرض تختی بزنم پاسخی را ارسال نمی کند و اگر کارکتر ‘ی’را در متن پیام ننویسم مانند تخت پاسخ ها را از پایگاه داده واکشی و از طریق sms ارسال می کند
مشکل به نظر من نوع کدینگ انها است من از utf 8 استفاده میکنم ولی نمیدانم چطور مشکل را برطرف نماییم
مشکل در صورتی ایجاد میشود که نیاز به واکشی اطلاعات از پایگاه داده ی سایت باشد
لطفادر تبدیل کارکتر ‘ی’ و یا رفع این مشکل راهنمایی فرمایید
چابهار
18 آگوست 2014
ممنون از ترجمه طاقت فرسایی این مقاله, دمورد یونیکد به فارسی آدم کم میاره مطالعه کنه چه برسه به اینکه بیاد ترجمه کنه …ممنون
D-ab
22 اکتبر 2014
واقعا ممنون – بسیار مطلب خوبی بود تا آخر خوندم !!
mahdi
6 نوامبر 2014
سلام
ممنون از مطلب بسیار خوبتون
یه سوال
فرض کنیم یونیکد سایت utf-8 هست
حالا میخوایم یونیکد یه قسمتی از نوشته مون windows-1252 باشه، چیکار باید بکنیم؟
مثلا برای کد های پخش آنلاینی که به کاربر داده میشه: تو این کد میخوای اسم سایتتو بیاری و بهش لینک بدی. اگه به صورت مشخص بنویسی (مثلا وب تارگت) که کاربرا متوجه میشن و امکان داره پاکش کنند ولی اگه وب تارگت رو به صورت windows-1252 دربیاری و بنویسی :
(وب تارگت)
کاربر معمولی متوجه نمیشه.
الان وقتی در کد ها یک نوشته رو به صورت windows-1252 داخل قرار میدی وقتی داخل سایت میری به خاطر utf8 بودن اون صفحه نوشته رو به صورت خوانا در میاره.
به نظر شما چطور باید این مشکل رو حل کرد؟
لیلا
16 نوامبر 2014
ممنونم از مقاله خوبتون. با زبان بسیار ساده و روان ترجمه شده بود.
محبوب
19 نوامبر 2014
با سلام
میخوام روی فشرده سازی متن کوتاه (پیامک) کار کنم
اگه بخوام لاتین باشه از مجموعه کاراکترهای Base64 و GSM modem 38 استفاده میکنم
در مورد کاراکتر فارسی مجوعه کاراکتر پیشنهادی دارید؟
محسن
4 آوریل 2015
عالی بود
درود بر شما
سعید
8 آوریل 2015
سلام و خسته نباشید
من اطلاعاتی به این شکل
مقالات-صنایع-ماشین-آلات
تو دیتا بیس دارم و میخوام اونا رو تبدیل به متون فارسی کنم. چطور می تونم ترجیحا با سی شارپ این کارو انجام بدم.
خیلی خیلی ممنون میشم اگه جواب رو برام میل کنید. و یا همینجا ذکر کنید.
طراحی سایت
14 می 2015
بسیار فوق العاده بود
و حرفه ای نگارش شده بود
علیرضا
29 ژوئن 2015
خیر ببینی جَوون، بسیار مفید و جامع بود،
مشکل من که حل شد، سلامت و برقرار باشی همیشه.
مهدی بشیری نژاد
17 آگوست 2015
سلام من امتحان می کنم ولی جواب دیگه می ده هنگام ذخیره untf-8 ذخیره کردم
مثلا گفتید
اگر صفحه را با استفاده از مجموعه کاراکتری UTF-8 مشاهده کنید، تنها سه کاراکتر: HЯ⾀ را خواهید دید. اگر آن را با مجموعه کاراکتری ISO-8859-1 مشاهده کنید شش کاراکتر جداگانه: €¾HЯâ را خواهید دید
ولی ISO-8859-1 باز HЯ⾀ نشون داده می شه
من از firefox 36 استفاده می کنم
ناصحی
17 سپتامبر 2015
قابل استفاده و خوب بود.
با تشکر
غلامرضا
6 نوامبر 2015
ای ول ای ول دمت گرم حال کردم. من خیلی بوغ بودم وقتی خوندم تازه فهمیدم چی به چیه. همش گیر داشتم که چرا حروف به یه سری آشغال تبدیل میشه. دمت گرم. خدا امواتتو بیامرزه. باقیات الصالحات خوبی درست کردی.موفق باشی
عابدین
25 نوامبر 2015
بسیار عالی توضیح دادین .ولی من انجام میدم کلماتم به کلمات نا خوانا تبدیل میشه دلیلش چی
sara
1 ژانویه 2016
با سلام
من دو سال پیش نرم افزار note everything رو تو گوشیم نصب کردم و یاداشت هایی نوشتم که بعضیاش رو با همین نرم افزار رمز دادمریا، بک اپ گرفتم و تو فلش با فرمت زیپ ذخیره کردو، حالا میخوم برگردونم نمیشه در واقع ورژن قبلی این نرم افزارو نمیدونم، فایلهای تو زیپ تکست هستن، در واقع مشکل اصلیم اون یاداداشت هایی هست که رمز گذاری شدن و به صورت
i/
sbl8aow3avzrhlgkygyy
ghjh
ذخیره شدن لطفا کمکم کنید
طاهري فر
17 ژانویه 2016
با سلام
امروزه فایل های pdf بسیاری در نت وجود دارند (فارسی) که توسط انکودینگ از متن اولیه به pdf تبدیل شده اند. در واقع این فایلها برای مشاهده مشکلی ندارند و کاملاً درست دیده میشوند ولی بعد از استخراج متن آنها توسط نرم افزارهای مختلف، کدینگ آنها کاملاً به هم میریزد و عملاً قابل استفاده نیستند. ظاهراً در ایران از این روش برای حفظ مالکیت محتوا استفاده میشود.
سوال من از شما دوست گرامی که تسلط کامل به coding دارید اینست که در مورد این فایلها چه کاری میتوان انجام داد؟ آیا راهی برای تبدیل متن اولیه آنها به utf-8 هست یا نه؟
نمونه فایل: http://tinyurl.com/h2bhvw7
علی
27 ژوئن 2016
متشکر خیلی خوب بود
Elahe
3 جولای 2016
عالی بود!
من نتونستم کامل بتونم ولی خیلی خوب بود.
رضا شاملو
29 دسامبر 2017
لازم است سپاس و قدر دانی خودم در مورد زحمت ترجمه این مقاله بسیار مفید به عرض سرکار برسانم .
موید باشید.
ali
12 مارس 2019
خسته نباشید خیلی عالی و کامل بود ، لازم دونستم ارتون برای این ترجمه خوب و روان تشکر کنم .
پیروز باشید
حمیدرضا
20 جولای 2019
خداوند پدر و مادرت و برات نگهداره
اگر که فوت کردند هم که خدا رحمتشون کنه.
واقعه دمت گرم، حال کردم تا حالا ندیدم مطلبی به این مفصلی در این زمینه امیدوار همیشه موفق و موید باشید.
اگه چهار تا مثل شما کار کنند دنیا گلستان می شه.
Sirvan
1 نوامبر 2019
خیلی زحمت کشیده اید ممنون
علی رضا
19 ژانویه 2020
سلام…خیلی عالی بود..مرسی..
mj
24 اکتبر 2020
خدا قوت پهلوان خسته نباشی دلاور :))))))))))))))))
عالی بود ممنون اندازه یه دنیا
Mmd
26 اکتبر 2020
زمان ذخیره از فهرست Encoding حالت ۸ ـUTF انتخاب نشود چه پیامی ظاهر میشود؟