علامت سوال به جای فارسی: ? و � یعنی چه؟

در متن به جای حروف فارسی ? یا لوزی‌های � می‌بینید؟ شبیه هم‌اند، اما علتشان فرق می‌کند. اغلب خود فایل سالم است، ولی گاهی حروف واقعاً از دست رفته‌اند. اینجا می‌بینید با کدام حالت روبه‌رو هستید.

با متن و این فایل‌ها کار می‌کند:

  • CSV
  • TXT
  • JSON
  • XML
  • SRT
  • VTT
  • SMI
  • TSV
  • MD
  • HTML
  • SQL
  • LOG

مثل خروجی اکسل، نسخه پشتیبان پایگاه داده، زیرنویس و کد وب‌سایت.

اصلاح

  1. فایل را بکشید یا متن را بچسبانید
  2. اصلاح خودکار انجام می‌شود
  3. نتیجه را کپی یا دانلود کنید
یا فایل را اینجا بکشید
  • بدون آپلود. فایل‌ها مستقیم داخل مرورگر شما اصلاح می‌شوند و هرگز از دستگاهتان خارج نمی‌شوند.

  • سرور در اتحادیه اروپا. Mojibuster روی سروری در فنلاند (اتحادیه اروپا) اجرا می‌شود؛ بنابراین مقررات عمومی حفاظت از داده‌ها (GDPR) برقرار است. متن مقررات (EUR-Lex، به انگلیسی)

حالت 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.
  • خط فرمان ویندوز: با کدگذاری کنسول کار می‌کند و نویسه‌های ناشناخته را ? نشان می‌دهد. معمولاً فقط نمایش خراب است، نه فایل.

از کجا بفهمید کدام حالت است؟

  1. فایل را در ویرایشگری باز کنید که کدگذاری را نشان می‌دهد، مثلاً Notepad++. اگر در نوار وضعیت «ANSI» یا «Windows-1256» نوشته شده، حالت 1 است.
  2. فایل را در Mojibuster بکشید. اگر با Windows-1256 خوانده شد و حروف فارسی برگشتند، حالت 1 بوده است؛ ببینید Windows-1256 و UTF-8.
  3. اگر Mojibuster از نویسه‌های از دست رفته خبر می‌دهد، حالت 2 است. آن‌وقت فقط یک خروجی تازه کمک می‌کند.

اگر به جای علامت سوال ترکیب‌هایی مثل ط³ظ„ط§ظ… یا سلام می‌بینید، خطای دیگری است که تقریباً همیشه قابل اصلاح است: موجیباکه چیست؟

پرسش‌های متداول

آیا Mojibuster می‌تواند ? را دوباره به حرف تبدیل کند؟

خیر. ? می‌تواند هر حرفی باشد و اطلاعات از دست رفته است. Mojibuster به این جاها دست نمی‌زند، اما تعدادشان را نشان می‌دهد.

چرا در یک برنامه � می‌بینم و در برنامه دیگر همه چیز درست است؟

یعنی فایل سالم است و فقط یکی از برنامه‌ها آن را با کدگذاری اشتباه می‌خواند. فایل را با Mojibuster به UTF-8 ذخیره کنید تا هر دو برنامه آن را درست نشان دهند.

نشانه � چیست؟

این نویسه جایگزین U+FFFD است. برنامه‌ها وقتی نمی‌توانند یک بایت را به حرف تبدیل کنند، آن را می‌گذارند. نشانه خطای کدگذاری است و جزو خود متن نیست.

راهنماهای دیگر