کدگذاری XML

کدگذاری کاراکترها در XML — UTF-8، UTF-16 و حل مشکلات فارسی

کدگذاری (Encoding) چیست؟

رایانه‌ها فقط عدد می‌فهمند. کدگذاری کاراکتر مشخص می‌کند هر کاراکتر با چه عددی ذخیره شود. اگر سند XML با کدگذاری اشتباه خوانده شود، متن به‌هم‌ریخته یا «�» می‌بینید.

اعلان کدگذاری در XML

در پرولوگ سند اعلام می‌شود:

<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-16"?>
<?xml version="1.0" encoding="ISO-8859-1"?>
اگر encoding را ننویسید، پیش‌فرض UTF-8 است. اما نوشتنش همیشه توصیه می‌شود تا ابهامی باقی نماند.

UTF-8 — پادشاه کدگذاری‌ها

UTF-8 امروز استاندارد عملی وب است:

مقایسه کدگذاری‌های رایج

کدگذاریحروف پشتیبانی‌شدهحجم هر کاراکتر
UTF-8همه (یونیکد)۱ تا ۴ بایت
UTF-16همه (یونیکد)۲ یا ۴ بایت
ISO-8859-1لاتین (غربی)۱ بایت
Windows-1256عربی/فارسی۱ بایت
ISO-8859-1 و Windows-1256 قدیمی‌اند و محدود. برای پروژه‌های جدید همیشه UTF-8 — مخصوصاً اگر متن فارسی دارید!

مشکل رایج: متن فارسی به‌هم‌ریخته

اگر متن فارسی در XML خراب نمایش داده می‌شود، تقریباً همیشه یکی از این‌هاست:

  1. فایل با کدگذاری دیگری (مثلاً Windows-1256) ذخیره شده اما UTF-8 اعلام شده
  2. سرور هدر Content-Type اشتباه می‌فرستد
  3. پایگاه داده با charset غیر utf8mb4 تنظیم شده
  4. ویرایشگر هنگام ذخیره، کدگذاری را تغییر داده

راه‌حل چک‌لیست فارسی

✅ فایل XML با کدگذاری UTF-8 (بدون BOM) ذخیره شود
✅ پرولوگ: <?xml version="1.0" encoding="UTF-8"?>
✅ هدر HTTP (در PHP): header('Content-Type: text/xml; charset=UTF-8');
✅ اتصال دیتابیس: charset=utf8mb4
✅ ویرایشگر VS Code: پایین صفحه "UTF-8" باشد

BOM چیست؟

Byte Order Mark سه بایت ابتدایی فایل (EF BB BF) که برخی ویرایشگرهای ویندوزی اضافه می‌کنند. مشکل: اگر قبل از پرولوگ XML باشد، پارسر خطا می‌دهد!

در VS Code می‌توانید با کلیک روی «UTF-8» در نوار پایین و انتخاب «Save with Encoding → UTF-8 without BOM» این مشکل را حل کنید.

کاراکترهای خارج از کدگذاری

اگر کاراکتری در کدگذاری سند نباشد، می‌توانید با موجودیت عددی بنویسید:

<!-- حتی در سند ASCII هم می‌توان فارسی نوشت! -->
<?xml version="1.0" encoding="US-ASCII"?>
<name>سارا</name>   <!-- سارا -->

این مبحث بخشی از دوره آموزش کامل XML است.

ابزارهای مرتبط