بوني كود
Punycode هو تمثيل لـ Unicode باستخدام مجموعة فرعية محدودة من أحرف ASCII، ويُستخدم لأسماء مضيفي الإنترنت . باستخدام Punycode، تُحوّل أسماء المضيفين التي تحتوي على أحرف Unicode إلى مجموعة فرعية من ASCII تتكون من حروف وأرقام وواصلات، وتُسمى هذه المجموعة الفرعية بالحروف والأرقام والواصلات (LDH). على سبيل المثال، تُشفّر كلمة München الألمانية ( بالإنجليزية : Munich ) على النحو التالي: Mnchen-3ya .
على الرغم من أن نظام أسماء النطاقات (DNS) يدعم تقنيًا تسلسلات عشوائية من الثمانيات في تسميات أسماء النطاقات، إلا أن معايير DNS توصي باستخدام مجموعة LDH الفرعية من ASCII المستخدمة عادةً لأسماء المضيفين، وتشترط أن تكون مقارنات السلاسل النصية بين أسماء نطاقات DNS غير حساسة لحالة الأحرف. يُعدّ بناء جملة Punycode طريقةً لترميز السلاسل النصية التي تحتوي على أحرف Unicode، مثل أسماء النطاقات الدولية (IDNA)، إلى مجموعة LDH الفرعية من ASCII التي يُفضّلها نظام DNS. وقد تمّ تحديده في طلب التعليقات رقم 3492 الصادر عن IETF. [ 1 ]
أصل الاسم
وبحسب ما ورد، فإن مؤلف طلب التعليقات، آدم كوستيلو، قد كتب ما يلي:
لماذا "Punycode"؟ لأنها تُنطق مثل Unicode، وهي مُصممة لترميز سلاسل Unicode. وهي "puny" من ثلاثة جوانب: مجموعة الأحرف المستخدمة في السلاسل المُرمّزة صغيرة، والسلاسل المُرمّزة قصيرة، والتنفيذ بسيط. [ 2 ]
وصف
كما ورد في RFC 3492، فإن "Punycode هو مثال على خوارزمية أكثر عمومية تُسمى Bootstring ، والتي تسمح للسلاسل النصية المُكوّنة من مجموعة صغيرة من نقاط الترميز "الأساسية" بتمثيل أي سلسلة نصية من نقاط الترميز المُستمدة من مجموعة أكبر بشكل فريد". يُحدد Punycode معلمات لخوارزمية Bootstring العامة لتتوافق مع خصائص نص Unicode. يُوضح هذا القسم إجراء ترميز Punycode، باستخدام السلسلة الألمانية "bücher" ( بالإنجليزية : books ) كمثال، والتي تُترجم إلى التسمية "bcher-kva".
لتبسيط خوارزميات التشفير وفك التشفير، لم يتم بذل أي محاولة لمنع بعض القيم المشفرة من تشفير قيم Unicode غير المقبولة: ومع ذلك، يجب التحقق من هذه القيم واكتشافها أثناء فك التشفير.
صُممت لغة Punycode للعمل مع جميع أنظمة الكتابة، وتتميز بقدرتها على التحسين الذاتي من خلال محاولة التكيف مع نطاقات الأحرف داخل السلسلة النصية أثناء معالجتها. وهي مُحسّنة في حالة احتواء السلسلة النصية على صفر أو أكثر من أحرف ASCII، بالإضافة إلى أحرف من نظام كتابة واحد آخر فقط، ولكنها قادرة على التعامل مع أي سلسلة Unicode. تجدر الإشارة إلى أنه بالنسبة لاستخدامها في نظام أسماء النطاقات (DNS)، يُفترض أن سلسلة اسم النطاق قد خضعت لعملية توحيد باستخدام nameprep ، وتمت تصفيتها (بالنسبة لنطاقات المستوى الأعلى ) وفقًا لجدول لغة مُسجل رسميًا قبل تحويلها إلى Punycode، وأن بروتوكول DNS يفرض قيودًا على الأطوال المقبولة لسلسلة Punycode الناتجة.
فصل أحرف ASCII
أولًا، تُنسخ جميع أحرف ASCII الموجودة في السلسلة من المدخلات إلى المخرجات، مع تخطي أي أحرف أخرى. على سبيل المثال، تُنسخ كلمة "bücher" إلى "bcher". إذا نُسخت أي أحرف، أي إذا كان هناك حرف ASCII واحد على الأقل في المدخلات، يُضاف واصلة ASCII إلى المخرجات (مثلًا، "bücher" → "bcher-"، ولكن "ü" → "").
لاحظ أن الواصلات هي نفسها أحرف ASCII. لذا، يمكن أن تكون موجودة في المدخلات، وإذا كانت كذلك، فسيتم نسخها إلى المخرجات. هذا لا يسبب أي لبس: إذا كانت المخرجات تحتوي على واصلات، فإن الواصلة المضافة هي دائمًا الأخيرة. وهي تُشير إلى نهاية أحرف ASCII.
ترميز الأحرف غير ASCII
تُرتّب الأحرف غير ASCII حسب قيمة Unicode، بدءًا من الأدنى (إذا تكرر حرفٌ ما أكثر من مرة، يُرتّب حسب موقعه). ثم يُشفّر كل حرف برقم واحد. يُحدّد هذا الرقم موقع إدراج الحرف ونوعه.
- فهرس في النتيجة لإدراج الكود عنده، بدءًا من 0 (للإدراج في البداية) . [ 3 ]
- عدد نقاط الإدراج (الطول الحالي للنتيجة زائد واحد).
- نقطة الترميز المخفضة هي نقطة ترميز Unicode لإدراج ناقص 128. [ 3 ]
الرقم المشفر هو نقاط الإدخال × نقطة الترميز المختزلة + الفهرس . [ 3 ] من خلال القسمة على نقاط الإدخال والحصول على الباقي، يمكن للمفكك تحديد نقطة الترميز المختزلة والفهرس .
توجد ستة مواضع إدخال محتملة لحرف في السلسلة "bcher" (بما في ذلك قبل الحرف الأول وبعد الحرف الأخير). يُرمز للحرف ü برمز Unicode 0xFC أو 252 (انظر ملحق Latin-1 )، ورمزه المُختزل هو 252 - 128 ، أي 124. يُدخل الحرف ü في الموضع 1، بعد الحرف b . بالتالي، سيضيف المُشفّر العدد 6 × 124 + 1 = 745 ، ويمكن للمُفكِّك استرجاع هذه الأرقام من خلال ⌊745 / 6⌋ = 124 و 745 mod 6 = 1 .
هذه الأرقام تتزايد بشكل مطرد. بالنسبة للحرف الثاني وما يليه من الأحرف المُضافة، يُكتب الفرق بين الرقم والرقم السابق.
ترميز الأرقام ذي الطول المتغير
يتم ترميز الرقم باستخدام الأحرف من a إلى z والأرقام من 0 إلى 9. وهو ليس نظامًا أساسه 36، بل نظام أكثر تعقيدًا، وهو نظام الأعداد الصحيحة المتغيرة الطول المعممة ، والذي يسمح بربط الأرقام معًا دون أي فاصل بينها.
هكذا يُستخدم الرمز "kva" لتمثيل الرقم 745:
يُستخدم نظام ترقيم ذو ترتيب صغير (little-endian) يسمح باستخدام رموز متغيرة الطول دون فواصل منفصلة: يشير الرقم الأقل من قيمة عتبة معينة إلى أنه الرقم الأكثر أهمية، وبالتالي نهاية الرقم. تعتمد قيمة العتبة على موقع الرقم في العدد، وكذلك على عمليات الإدخال السابقة، لزيادة الكفاءة. وبناءً على ذلك، تختلف أوزان الأرقام.
في هذه الحالة، يتم استخدام نظام عددي مكون من 36 رمزًا، حيث تساوي الأحرف من 'a' إلى 'z' غير الحساسة لحالة الأحرف الأرقام العشرية من 0 إلى 25، وتساوي الأحرف من '0' إلى '9' الأرقام العشرية من 26 إلى 35. وبالتالي، فإن "kva" يتوافق مع سلسلة الأرقام العشرية "10 21 0".
لفك تشفير هذه السلسلة من الرموز، يلزم استخدام سلسلة من العتبات، وهي في هذه الحالة (1، 1، 26، 26، ...). [ 4 ] وزن (أو قيمة خانة ) الرقم الأقل أهمية هو دائمًا 1: 'k' (=10) بوزن 1 يساوي 10. بعد ذلك، يعتمد وزن الرقم التالي على العتبة الأولى: بشكل عام، لأي قيمة n ، يكون وزن الرقم ( n +1) هو w × (36 − t )، حيث w هو الوزن السابق و t هي عتبة الرقم n . في هذه الحالة، القيمة المكانية للرمز الثاني هي 36 ناقص القيمة الحدية السابقة وهي 1، ما يساوي 35. بالتالي، فإن مجموع الرمزين الأولين 'k' (=10) و'v' (=21) هو 10 × 1 + 21 × 35. بما أن قيمة الرمز الثاني لا تقل عن قيمته الحدية 1، فهناك المزيد. مع ذلك، بما أن الرمز الثالث في هذا المثال هو 'a' (=0)، يمكننا تجاهل حساب وزنه. لذلك، يمثل "kva" العدد العشري (10 × 1) + (21 × 35) = 745.
سيتم ترميز الرقم 745 على النحو التالي: 10 + 21 × 35 + 0 (الأساس 35 مستخدم للرقم الثاني، الرقم الأكثر أهمية 0 مطلوب كفاصل)، 10 → 'k'، 21 → 'v'، 0 → 'a'، لذا "bücher" → "bcher-kva".
تُحدد العتبات نفسها لكل حرف مُشفّر متتالٍ بواسطة خوارزمية تُبقيها بين 1 و26 شاملةً. [ 5 ] ويمكن بعد ذلك استخدام حالة الأحرف لتوفير معلومات حول الحالة الأصلية للسلسلة. [ 6 ]
نظرًا لأن الأحرف الخاصة تُرتّب حسب نقاط ترميزها بواسطة خوارزمية الترميز، فعند إدخال حرف خاص ثانٍ في كلمة "bücher"، يكون الاحتمال الأول هو "büücher" برمز "bcher-kvaa"، والثاني "bücüher" برمز "bcher-kvab"، وهكذا. بعد "bücherü" برمز "bcher-kvae" تأتي الرموز التي تمثل إدخال الحرف ý، وهو حرف Unicode الذي يلي ü، بدءًا من "ýbücher" برمز "bcher-kvaf" (يختلف عن "übücher" برمز "bcher-jvab")، وهكذا.
بادئة ACE لأسماء النطاقات الدولية
لمنع الواصلات في أسماء النطاقات غير الدولية من التسبب في فك تشفير Punycode، xn--تُضاف السلسلة إلى تسلسلات Punycode في أسماء النطاقات الدولية. يُطلق على هذا اسم ACE (الترميز المتوافق مع ASCII). [ 7 ]
وبالتالي سيتم تمثيل اسم النطاق "bücher.tld" في عنوان URL على النحو التالي "xn--bcher-kva.tld".
أمثلة
يوضح الجدول التالي أمثلة على ترميزات Punycode لأنواع مختلفة من المدخلات. [ 8 ]
| مدخل | بوني كود | وصف |
|---|---|---|
| السلسلة الفارغة. | ||
| أ | أ- | أحرف ASCII فقط ، حرف واحد صغير. |
| أ | أ- | أحرف ASCII فقط، حرف واحد كبير. |
| 3 | 3- | أحرف ASCII فقط، واحد، رقم. |
| - | -- | أحرف ASCII فقط، واحد، واصلة. |
| -- | --- | أحرف ASCII فقط، شرطتان. |
| لندن | لندن- | أحرف ASCII فقط، أكثر من حرف واحد، بدون فواصل. |
| لويد-أتكينسون | لويد-أتكينسون- | أحرف ASCII فقط، وواصلة واحدة. |
| يحتوي هذا على مسافات | هذا يحتوي على مسافات- | أحرف ASCII فقط، مع وجود مسافات. |
| -> 1.00 دولار أمريكي <- | -> 1.00 دولار أمريكي <-- | أحرف ASCII فقط، رموز مختلطة. |
| ب | d0a | لا توجد أحرف ASCII، حرف واحد من الأحرف السيريلية . |
| ü | tda | لا توجد أحرف ASCII، حرف واحد من مكمل Latin-1 . |
| α | mxa | لا توجد أحرف ASCII، حرف يوناني واحد . |
| مثلا | fsq | لا توجد أحرف ASCII، حرف واحد CJK . |
| 😉 | n28h | لا توجد أحرف ASCII، حرف إيموجي واحد فقط . |
| αβγ | mxacd | لا يُسمح باستخدام أحرف ASCII، يُسمح بأكثر من حرف واحد. |
| ميونخ | ميونخ-3يا | سلسلة مختلطة، تحتوي على حرف واحد ليس حرفًا من أحرف ASCII. |
| ميونخ-3يا | ميونخ-3يا- | Punycode مزدوج التشفير لكلمة "München". |
| ميونخ الشرقية | Mnchen-Ost-9db | سلسلة مختلطة، تحتوي على حرف واحد ليس من نوع ASCII، وواصلة. |
| محطة قطار ميونخ الشرقية | محطة قطار ميونخ الشرقية u6b | سلسلة مختلطة، تحتوي على مسافة واحدة، وواصلة واحدة، وحرف واحد ليس من نوع ASCII. |
| abæcdöef | abcdef-qua4k | سلسلة مختلطة، حرفان غير ASCII. |
| أثينا | jxafb0a0a | اليونانية ( الرتيبة )، بدون ASCII. |
| правда | 80aafi6cg | اللغة الروسية ، بدون رموز ASCII. |
| ยจฆฟคฏข | 22cdfh1b8fsa | التايلاندية ، بدون رموز ASCII. |
| شكرا | hq1bm8jm9l | اللغة الكورية ، بدون رموز ASCII. |
| ドメイン名例 | eckwd4c7cu47r2wf | اليابانية ، بدون رموز ASCII. |
| ماجي で كوي す る 5 秒 前 | MajiKoi5-783gue6qz075azm5e | اللغة اليابانية باستخدام رموز ASCII. |
| «كتب» | bcher-kva8445foa | نصوص مختلطة غير ASCII (ملحق اللاتينية 1 و CJK). |
انظر أيضاً
مراجع
- ↑ RFC 3492 ، Punycode: ترميز سلسلة التمهيد لـ Unicode لأسماء النطاقات الدولية في التطبيقات (IDN) ، أ. كوستيلو، جمعية الإنترنت (مارس 2003)
- ↑ ماكسيميليان لاوميستر (18 يوليو 2020). "لماذا يُطلق عليه اسم "Punycode"؟" . تم الاطلاع عليه بتاريخ 13 يناير 2025 .
- 1 2 3 RFC 3492، القسم 6.3
- ↑ هذا صحيح بالنسبة للحرف المشفر الأول (أو، من حيث RFC 3492، أول "دلتا"): انظر RFC 3492، القسم 6.
- ↑ RFC 3492، القسم 3.4، 5.
- ↑ RFC 3492، الملحق أ.
- ↑ هيئة أرقام الإنترنت المخصصة (14 فبراير 2003). "استكمال اختيار هيئة أرقام الإنترنت المخصصة لبادئة IDNA" . www.atm.tut.fi. مؤرشف من الأصل بتاريخ 27 أبريل 2010. تم الاطلاع عليه بتاريخ 22 سبتمبر 2017 .
- ↑ تم إنشاء كود Punycode في هذا الجدول باستخدام برنامج الترميز المدمج "punycode" في لغة برمجة بايثون الإصدار 3.8 (
s.encode("punycode")). انظر صفحة النقاش .
روابط خارجية
- معيار IETF Punycode
- عرض توضيحي لتقنية ICU IDNA: عرض توضيحي عبر الإنترنت لكيفية قيام وحدة العناية المركزة (ICU) بتنفيذ عمليات IDN
- قائمة نطاقات المستوى الأعلى التي يعتبرها مطورو موزيلا ذات سياسة فعالة لمكافحة انتحال الهوية لتسجيل الأسماء
- IDN و Punycode في IE7
- محول بسيط لـ Punycode
- تنسيقات تحويل يونيكود
- أسماء النطاقات الدولية
