حالت 1: لوزی � در فایل سالم
اگر ویرایشگر، پخشکننده یا مرورگر به جای همه حروف فارسی � نشان میدهد، فایل معمولاً با کدگذاری قدیمی Windows-1256 ذخیره شده و برنامه آن را با UTF-8 میخواند. بایتهای حروف فارسی در UTF-8 معتبر نیستند، برای همین برنامه � را فقط هنگام نمایش میگذارد. داخل خود فایل بایتهای درست سر جایشان هستند. درباره این دو کدگذاری: Windows-1256 و UTF-8.
راه حل: فایل اصلی را در کادر بالا بکشید. Mojibuster هنگام خواندن، کدگذاری را تشخیص میدهد و فایل را با UTF-8 ذخیره میکند؛ «ي» و «ك» عربی فایلهای قدیمی هم به «ی» و «ک» فارسی برمیگردند. مهم: از خود فایل استفاده کنید، نه از متنی که از برنامه کپی کردهاید؛ با کپی کردن، � برای همیشه میماند.
حالت 2: � یا ? در خود متن نوشته شده
اگر برنامهای متن را با � ذخیره یا ارسال کرده باشد، حروف اصلی از دست رفتهاند. ? هم همینطور است: برنامهها آن را وقتی میگذارند که حرفی در کدگذاری مقصد وجود ندارد؛ مثلاً هنگام ذخیره با ASCII یا نوشتن در ستونی از پایگاه داده که فارسی را پشتیبانی نمیکند. آنوقت سلام به ???? تبدیل میشود.
این حروف قابل بازیابی نیستند، چون همه به یک نشانه تبدیل شدهاند. Mojibuster حدس نمیزند، بلکه نشان میدهد چند جا آسیب دیده است. فقط منبع کمک میکند: دوباره خروجی بگیرید یا از نسخه پشتیبان استفاده کنید.
علامت سوالها از کجا میآیند؟
- پایگاه داده: ستون یا اتصال روی
latin1یاasciiاست و دادهها با UTF-8 میرسند. آنوقت MySQL به جای فارسی????ذخیره میکند؛ ببینید MySQL و phpMyAdmin. - سایت قدیمی PHP: صفحه با Windows-1256 ذخیره شده، اما کدگذاری در هدر یا در
<meta charset>اعلام نشده است. مرورگر آن را با UTF-8 میخواند و�نشان میدهد. اگر هم اتصال به پایگاه داده بدون کدگذاری باز شود، به جای حروف?در پایگاه داده نوشته میشود. - Notepad، «Save As» ← ANSI: در ویندوز انگلیسی، ANSI یک کدگذاری غربی است و حروف فارسی به صورت
?ذخیره میشوند. وقتی زبان برنامههای غیریونیکد فارسی باشد، ANSI همان Windows-1256 است: فارسی میماند، اما ارقام فارسی۱۲۳، «ۀ» و ایموجیها?میشوند. - برنامههای ایمیل قدیمی: نامههای Windows-1256 بدون اعلام درست کدگذاری در برنامههایی باز میشوند که UTF-8 انتظار دارند، و به جای متن
�دیده میشود. - PowerShell 5.1: دستور
Export-Csvبهطور پیشفرض ASCII مینویسد و حروف فارسی را با?جایگزین میکند؛ ببینید PowerShell. - Python: کد
encode('ascii', errors='replace')بیصدا حروف را به?تبدیل میکند؛ ببینید Python و pandas. - خط فرمان ویندوز: با کدگذاری کنسول کار میکند و نویسههای ناشناخته را
?نشان میدهد. معمولاً فقط نمایش خراب است، نه فایل.
از کجا بفهمید کدام حالت است؟
- فایل را در ویرایشگری باز کنید که کدگذاری را نشان میدهد، مثلاً Notepad++. اگر در نوار وضعیت «ANSI» یا «Windows-1256» نوشته شده، حالت 1 است.
- فایل را در Mojibuster بکشید. اگر با Windows-1256 خوانده شد و حروف فارسی برگشتند، حالت 1 بوده است؛ ببینید Windows-1256 و UTF-8.
- اگر Mojibuster از نویسههای از دست رفته خبر میدهد، حالت 2 است. آنوقت فقط یک خروجی تازه کمک میکند.
اگر به جای علامت سوال ترکیبهایی مثل ط³ظ„ط§ظ… یا سلام میبینید، خطای دیگری است که تقریباً همیشه قابل اصلاح است: موجیباکه چیست؟
پرسشهای متداول
آیا Mojibuster میتواند ? را دوباره به حرف تبدیل کند؟
خیر. ? میتواند هر حرفی باشد و اطلاعات از دست رفته است. Mojibuster به این جاها دست نمیزند، اما تعدادشان را نشان میدهد.
چرا در یک برنامه � میبینم و در برنامه دیگر همه چیز درست است؟
یعنی فایل سالم است و فقط یکی از برنامهها آن را با کدگذاری اشتباه میخواند. فایل را با Mojibuster به UTF-8 ذخیره کنید تا هر دو برنامه آن را درست نشان دهند.
نشانه � چیست؟
این نویسه جایگزین U+FFFD است. برنامهها وقتی نمیتوانند یک بایت را به حرف تبدیل کنند، آن را میگذارند. نشانه خطای کدگذاری است و جزو خود متن نیست.