تصحيح الأخطاء7 دقائق للقراءة

كيفية إصلاح أخطاء "URI Malformed" في JavaScript

استكشف وأصلح خطأ "URIError: URI malformed" الشائع في JavaScript من خلال حلول عملية.

فهم خطأ URIError: URI Malformed

يحدث خطأ URIError: URI malformed في JavaScript عندما تحاول فك ترميز سلسلة نصية تحتوي على تسلسلات percent-encoded غير صالحة. يُطلَق هذا الخطأ من قِبل decodeURI() أو decodeURIComponent() عندما تصادف حرفًا مُرمَّزًا بشكل خاطئ.

الأسباب الشائعة

1. علامات النسبة المئوية المنفردة

علامة النسبة المئوية (%) التي لا تتبعها خانتان سُداسيتان عشريتان (hexadecimal) بالضبط تُعدّ غير صالحة. على سبيل المثال، ستؤدي % أو %G أو %2 (غير مكتملة) جميعها إلى حدوث هذا الخطأ.

// هذه ستُطلق URIError
decodeURIComponent('%');        // علامة % منفردة
decodeURIComponent('%2');       // تسلسل غير مكتمل
decodeURIComponent('%GH');      // خانات سداسية عشرية غير صالحة
decodeURIComponent('100%');     // علامة % في النهاية دون خانات سداسية عشرية

2. تسلسلات UTF-8 غير الصالحة

عندما لا تُشكّل وحدات البايت المُرمَّزة بنظام percent-encoding تسلسل حرف UTF-8 صالحًا، لا يستطيع أداة فك الترميز تحويلها إلى سلسلة نصية. يمكن أن يحدث ذلك عندما تكون البيانات تالفة أو مُرمَّزة باستخدام ترميز أحرف مختلف.

3. الترميز المزدوج

يحدث الترميز المزدوج عندما يتم ترميز سلسلة نصية مُرمَّزة مسبقًا مرة أخرى. على سبيل المثال، تتحول %20 (مسافة مُرمَّزة) إلى %2520. وعندما تحاول فك ترميز السلسلة الأصلية، قد تكون التسلسلات غير صالحة.

كيفية إصلاحه

الحل 1: استخدام try-catch

function safeDecode(str) {
  try {
    return decodeURIComponent(str);
  } catch (e) {
    // أعِد السلسلة الأصلية إذا فشل فك الترميز
    console.warn('Failed to decode:', str, e.message);
    return str;
  }
}

الحل 2: التحقق قبل فك الترميز

function isValidEncodedURI(str) {
  try {
    decodeURIComponent(str);
    return true;
  } catch {
    return false;
  }
}

function fixMalformedURI(str) {
  // استبدل علامة % المنفردة بـ %25 (النسبة المئوية المُرمَّزة)
  return str.replace(/%(?![0-9A-Fa-f]{2})/g, '%25');
}

الحل 3: منع الترميز المزدوج

function smartEncode(str) {
  // حاول أولًا فك الترميز - إذا نجح، فإن السلسلة
  // مُرمَّزة بالفعل
  try {
    const decoded = decodeURIComponent(str);
    // إذا غيّر فك الترميز السلسلة، فقد كانت مُرمَّزة
    if (decoded !== str) {
      return str; // مُرمَّزة بالفعل، أعِدها كما هي
    }
  } catch {
    // ليست سلسلة مُرمَّزة صالحة، قم بترميزها
  }
  return encodeURIComponent(str);
}

أفضل الممارسات للوقاية

  • استخدم دائمًا try-catch عند فك ترميز عناوين URL المقدَّمة من المستخدم أو الخارجية
  • تحقّق من صحة عناوين URL قبل معالجتها
  • احرص على عدم ترميز القيم بشكل مزدوج
  • استخدم واجهتَي URL و URLSearchParams عند الإمكان -- فهما تتعاملان مع الترميز بشكل صحيح
  • نظّف قيم سلسلة الاستعلام (query string) قبل ترميزها
  • سجّل عناوين URL المشوّهة لأغراض تصحيح الأخطاء

مقالات ذات صلة

جرّب أدواتنا المجانية