بوني كود

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 فقط، حرف واحد كبير.
33-أحرف 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öefabcdef-qua4kسلسلة مختلطة، حرفان غير ASCII.
أثيناjxafb0a0aاليونانية ( الرتيبة )، بدون ASCII.
правда80aafi6cgاللغة الروسية ، بدون رموز ASCII.
ยจฆฟคฏข22cdfh1b8fsaالتايلاندية ، بدون رموز ASCII.
شكراhq1bm8jm9lاللغة الكورية ، بدون رموز ASCII.
ドメイン名例eckwd4c7cu47r2wfاليابانية ، بدون رموز ASCII.
ماجي で كوي す る 5 秒 前MajiKoi5-783gue6qz075azm5eاللغة اليابانية باستخدام رموز ASCII.
«كتب»bcher-kva8445foaنصوص مختلطة غير ASCII (ملحق اللاتينية 1 و CJK).

انظر أيضاً

مراجع

  1. RFC 3492 ، Punycode: ترميز سلسلة التمهيد لـ Unicode لأسماء النطاقات الدولية في التطبيقات (IDN) ، أ. كوستيلو، جمعية الإنترنت (مارس 2003)
  2. ماكسيميليان لاوميستر (18 يوليو 2020). "لماذا يُطلق عليه اسم "Punycode"؟" . تم الاطلاع عليه بتاريخ 13 يناير 2025 .
  3. 1 2 3 RFC 3492، القسم 6.3
  4. هذا صحيح بالنسبة للحرف المشفر الأول (أو، من حيث RFC 3492، أول "دلتا"): انظر RFC 3492، القسم 6.
  5. RFC 3492، القسم 3.4، 5.
  6. RFC 3492، الملحق أ.
  7. هيئة أرقام الإنترنت المخصصة (14 فبراير 2003). "استكمال اختيار هيئة أرقام الإنترنت المخصصة لبادئة IDNA" . www.atm.tut.fi. مؤرشف من الأصل بتاريخ 27 أبريل 2010. تم الاطلاع عليه بتاريخ 22 سبتمبر 2017 .
  8. تم إنشاء كود Punycode في هذا الجدول باستخدام برنامج الترميز المدمج "punycode" في لغة برمجة بايثون الإصدار 3.8 (s.encode("punycode")). انظر صفحة النقاش .