Punycode

أساسيات النطاقات
نظام ترميز يحول أسماء النطاقات يونيكود إلى صيغة ASCII متوافقة، مما يتيح أسماء النطاقات الدولية للعمل مع DNS.
← العودة إلى القاموس

ما هو Punycode؟

Punycode هو صيغة ترميز معرّفة في RFC 3492 تحوّل سلاسل Unicode إلى مجموعة ASCII المحدودة التي يدعمها DNS. وهو الأساس التقني الذي يجعل أسماء النطاقات المدوّلة (IDNs) ممكنة، إذ يتيح لأسماء النطاقات بأي لغة العمل مع بنية DNS الحالية.

المشكلة التي يحلها Punycode

صُمم نظام أسماء النطاقات في ثمانينيات القرن الماضي مع مراعاة أحرف ASCII فقط. ولا يمكن أن تحتوي تسميات DNS إلا على:

استبعد هذا القيد مليارات مستخدمي الإنترنت الذين لا يستخدمون الأبجدية اللاتينية أساساً. ويسد Punycode هذه الفجوة بترميز أي سلسلة Unicode إلى ASCII صالح.

كيف يعمل ترميز Punycode

يستخدم ترميز Punycode خوارزمية ذكية تحافظ على أحرف ASCII، بينما تحوّل الأحرف غير ASCII إلى تمثيل ASCII مدمج صالح للاستخدام في DNS.

عملية الترميز

1. فصل الأحرف: تقسيم الأحرف إلى ASCII وغير ASCII

2. نسخ ASCII: إبقاء جميع أحرف ASCII في مواضعها الأصلية

3. ترميز غير ASCII: استخدام ترميز عام للأعداد الصحيحة متغير الطول

4. إضافة البادئة: إضافة «xn--» للدلالة على ترميز Punycode

أمثلة

النص الأصلي (Unicode)التمثيل المرمّز (Punycode)
münchen (ألماني)xn--mnchen-3ya
北京 (صيني)xn--fiqs8s
münchen.de (ألماني)xn--mnchen-3ya.de
中文.com (صيني)xn--fiq228c.com
café.com (فرنسي)xn--caf-dma.com

بادئة «xn--»

تُسمى بادئة «xn--» بادئة ACE (ASCII Compatible Encoding). وهي تشير إلى محللات DNS والتطبيقات إلى أن التسمية تحتوي على محتوى مرمّز بـ Punycode. وهذه البادئة:

Punycode عملياً

معالجة المتصفح

تتعامل المتصفحات الحديثة مع Punycode تلقائياً:

User types: 中文.com

Browser sends: xn--fiq228c.com (to DNS)

Browser displays: 中文.com (in address bar)

تطبيق المطور

JavaScript (Node.js):
const punycode = require('punycode/');

// Encode to Punycode

const encoded = punycode.toASCII('münchen.de');

// Result: xn--mnchen-3ya.de

// Decode from Punycode

const decoded = punycode.toUnicode('xn--mnchen-3ya.de');

// Result: münchen.de

Python:
domain = 'münchen.de'

encoded = domain.encode('idna').decode('ascii')

# Result: xn--mnchen-3ya.de

معالجة عناوين URL

عند العمل مع عناوين URL التي تحتوي على IDNs:

// URL API handles Punycode automatically

const url = new URL('https://中文.com/path');

console.log(url.hostname); // xn--fiq228c.com

console.log(url.href); // https://xn--fiq228c.com/path

الآثار الأمنية

إن قدرة ترميز Punycode على تمثيل أي حرف Unicode تنشئ مخاطر أمنية لنطاقات الويب:

انتحال بصري

يمكن للمهاجمين تسجيل نطاقات تبدو مطابقة لمواقع شرعية:

аррlе.com (Cyrillic 'а' and 'р')

apple.com (Latin letters)

قد يظهر النطاقان متطابقين في بعض الخطوط، لكنهما نطاقان مختلفان.

حماية المتصفحات

لمواجهة الانتحال، تطبق المتصفحات وسائل حماية:

1. كشف الخطوط المختلطة: عرض Punycode للنطاقات التي تخلط الخطوط بصورة مريبة

2. كشف الأحرف المتشابهة: الإبلاغ عن النطاقات التي تستخدم أحرفاً تشبه ASCII

3. القوائم المسموح بها: السماح بعرض Unicode فقط لنطاقات TLD المعروفة

التعامل مع Punycode في واجهات API

عند بناء أدوات النطاقات:

خزّن Punycode دائماً: استخدم صيغة ASCII داخلياً للاتساق والفهرسة في قاعدة البيانات. اقبل الصيغتين: اسمح للمستخدم بإدخال Unicode أو Punycode، وحوّل الصيغة عند الحاجة. اعرض Unicode: أظهر الصيغة المقروءة للبشر في واجهات المستخدم.
function normalizeDomain(input) {

const punycode = require('punycode/');

// Convert to lowercase Punycode for internal use

return punycode.toASCII(input.toLowerCase());

}

يكون Punycode شفافاً لمعظم المستخدمين، لكنه معرفة أساسية للمطورين الذين يبنون تطبيقات ويب مدوّلة.

استفد من هذه المعرفة

استخدم API الخاص بـ DomScan للتحقق من توفر النطاقات وصحتها والمزيد.