هذا هو الأمر perlebcdic الذي يمكن تشغيله في موفر الاستضافة المجاني OnWorks باستخدام إحدى محطات العمل المجانية المتعددة عبر الإنترنت مثل Ubuntu Online أو Fedora Online أو محاكي Windows عبر الإنترنت أو محاكي MAC OS عبر الإنترنت
برنامج:
اسم
perlebcdic - اعتبارات لتشغيل Perl على منصات EBCDIC
الوصف
استكشاف بعض المشكلات التي تواجه مبرمجي Perl على أجهزة الكمبيوتر المعتمدة على EBCDIC.
تم وضع علامة XXX على أجزاء هذا المستند التي لا تزال غير مكتملة.
عملت إصدارات Perl المبكرة على بعض أجهزة EBCDIC، ولكنها كانت آخر نسخة معروفة تم تشغيلها
كان EBCDIC هو الإصدار 5.8.7، حتى الإصدار 5.22، عندما يعمل مركز Perl مرة أخرى على z/OS. من الناحية النظرية، فإنه
يمكن أن تعمل على نظام التشغيل OS/400 أو BS2000 من شركة Siemens (أو خلفائهم)، ولكن هذا لم يتم اختباره. في
v5.22، ليست كل الوحدات الموجودة في CPAN ولكن يتم شحنها مع لغة Perl الأساسية تعمل على z/OS.
إذا كنت تريد استخدام Perl على جهاز غير z/OS EBCDIC، فيرجى إخبارنا بذلك عن طريق إرسال بريد
إلى [البريد الإلكتروني محمي]
إن كتابة لغة Perl على منصة EBCDIC لا تختلف حقًا عن الكتابة على منصة "ASCII".
ولكن مع أرقام أساسية مختلفة، كما سنرى قريبا. عليك أن تعرف
شيء عن تلك المنصات "ASCII" لأن الوثائق متحيزة وسوف
استخدم بشكل متكرر أرقام الأمثلة التي لا تنطبق على EBCDIC. هناك أيضًا عدد قليل جدًا من CPAN
الوحدات المكتوبة لـ EBCDIC والتي لا تعمل على ASCII؛ بدلا من ذلك واسعة
غالبية وحدات CPAN مكتوبة لـ ASCII، وقد يحدث أن يعمل بعضها على EBCDIC،
بينما تم تصميم عدد قليل منها للعمل بشكل محمول على كليهما.
إذا كان الرمز الخاص بك يستخدم فقط الحروف المكونة من 52 حرفًا من AZ وaz، بالإضافة إلى المسافة والأرقام من 0 إلى 9 و
أحرف علامات الترقيم التي يستخدمها Perl، بالإضافة إلى بعض عناصر التحكم التي يُشار إليها بالهروب
تسلسلات مثل "\n" و"\t"، فلا يوجد شيء مميز في استخدام Perl والتعليمات البرمجية الخاصة بك
قد تعمل بشكل جيد للغاية على جهاز ASCII دون تغيير.
ولكن إذا كتبت رمزًا يستخدم "\005" ليعني TAB أو "\xC1" ليعني "A" أو "\xDF"
لتعني "ye" ("y" صغير مع diaeresis)، فقد يعمل الرمز الخاص بك جيدًا على EBCDIC الخاص بك
النظام الأساسي، ولكن ليس على نظام ASCII. من الجيد القيام بذلك إذا لم يرغب أحد في تشغيل موقعك
التعليمات البرمجية على منصة ASCII؛ ولكن التحيز في هذه الوثيقة سيكون في كتابة التعليمات البرمجية المحمولة
بين أنظمة EBCDIC وASCII. مرة أخرى، إذا كانت كل شخصية تهتم بها سهلة
يمكن إدخالها من لوحة المفاتيح، وليس من الضروري أن تعرف أي شيء عن ASCII، ولكن الكثير
لا تسمح لك لوحات المفاتيح بسهولة بإدخال الحرف "\xDF" مباشرة، لذلك لديك
لتحديده بشكل غير مباشر، مثل استخدام تسلسل الهروب "\xDF". في تلك الحالات
من الأسهل معرفة شيء ما عن مجموعات أحرف ASCII/Unicode. إذا كنت تعرف ذلك
الحرف "ye" الصغير هو "U+00FF"، ثم يمكنك بدلاً من ذلك تحديده كـ "\N{U+FF}"، والحصول على
يترجمها الكمبيوتر تلقائيًا إلى "\xDF" على النظام الأساسي الخاص بك، ويتركها كـ "\xFF" قيد التشغيل
تلك ASCII. أو يمكنك تحديده بالاسم، "\N{LATIN SMALL LETTER Y With DIAERESIS" و
ليس من الضروري معرفة الأرقام. كلتا الطريقتين تعملان، لكنهما تتطلبان الإلمام بـ Unicode.
COMMON حرف CODE الاطقم
ASCII
الكود القياسي الأمريكي لتبادل المعلومات (ASCII أو US-ASCII) عبارة عن مجموعة من
الأعداد الصحيحة التي تتراوح من 0 إلى 127 (عشري) والتي لها تفسيرات موحدة بواسطة
أجهزة الكمبيوتر التي تستخدم ASCII. على سبيل المثال، 65 يعني الحرف "أ". النطاق 0..127 يمكن أن يكون
يتم تغطيتها عن طريق ضبط البتات في رقم ثنائي مكون من 7 بتات، ومن ثم تتم الإشارة إلى المجموعة أحيانًا
إلى "7 بت ASCII". تم وصف ASCII من قبل المعهد الوطني الأمريكي للمعايير
وثيقة ANSI X3.4-1986. تم وصفه أيضًا بواسطة ISO 646:1991 (مع الترجمة لـ
رموز العملة). مجموعة ASCII الكاملة مذكورة في الجدول أدناه كأول 128
عناصر. اللغات التي يمكن كتابتها بشكل مناسب باستخدام الأحرف الموجودة في ASCII تشمل
الإنجليزية وهاواي والإندونيسية والسواحيلية وبعض اللغات الأمريكية الأصلية.
معظم مجموعات الأحرف غير EBCDIC هي مجموعات فرعية من ASCII. هذا هو الأعداد الصحيحة 0-127 يعني
ما يقوله ASCII يقصدونه. لكن الأعداد الصحيحة 128 وما فوق خاصة بمجموعة الأحرف.
العديد منها تتلاءم تمامًا مع 8 بتات، باستخدام ASCII كـ 0-127، مع تحديد ما
يعني 128-255، وعدم استخدام أي شيء أعلى من 255. وبالتالي، فهي بايت واحد (أو ثماني بتات إذا
تفضل) مجموعات الأحرف. أحد العناصر المهمة (نظرًا لأن Unicode عبارة عن مجموعة شاملة منه) هو
مجموعة أحرف ISO 8859-1.
ISO 8859
الأيزو 8859-$n هي عبارة عن مجموعة من مجموعات رموز الأحرف من International
منظمة التقييس (ISO)، تضيف كل منها أحرفًا إلى مجموعة ASCII
التي توجد عادة في لغات مختلفة، وكثير منها يعتمد على اللغة الرومانية، أو
الأبجدية اللاتينية. معظمها للغات الأوروبية، ولكن هناك أيضًا لغات للغة العربية،
اليونانية والعبرية والتايلاندية. هناك مراجع جيدة على شبكة الإنترنت حول كل هذه الأمور.
لاتيني 1 (ايزو 8859-1)
امتداد خاص بـ 8 بت لـ ASCII يتضمن لغة لاتينية خطيرة وحادة
الشخصيات. اللغات التي يمكن أن تستخدم ISO 8859-1 تشمل جميع اللغات التي يغطيها
ASCII وكذلك الأفريكانية والألبانية والباسكية والكتالونية والدانمركية والفاروية والفنلندية،
النرويجية والبرتغالية والإسبانية والسويدية. تمت تغطية اللغة الهولندية وإن كانت بدون حرف ij
ضمد. تمت تغطية اللغة الفرنسية أيضًا ولكن بدون الرباط. يمكن للألمانية استخدام ISO 8859-1
ولكن يجب أن يتم ذلك بدون علامات الاقتباس ذات النمط الألماني. هذه المجموعة مبنية على الغرب
الامتدادات الأوروبية لـ ASCII وهي شائعة في العمل على شبكة الإنترنت العالمية. في آي بي إم
مصطلحات تعريف مجموعة رموز الأحرف، يُعرف ISO 8859-1 أيضًا باسم CCSID 819 (أو
أحيانًا 0819 أو حتى 00819).
EBCDIC
يشير رمز التبادل العشري المشفر الثنائي الممتد إلى مجموعة كبيرة من الرموز الفردية
ومجموعات الأحرف المشفرة متعددة البايت والتي تختلف تمامًا عن ASCII وISO 8859-1،
وكلها مختلفة قليلاً عن بعضها البعض؛ يتم تشغيلها عادةً على أجهزة الكمبيوتر المضيفة. ال
ترميزات EBCDIC مشتقة من امتدادات بايت 8 بت لترميزات بطاقة Hollerith المثقوبة،
والتي تسبق ASCII بفترة طويلة. كان التخطيط على البطاقات بحيث تم ضبط البتات العالية
الأحرف الأبجدية الكبيرة والصغيرة "[az]" و"[AZ]"، ولكن كانت هناك فجوات
ضمن كل نطاق من الأبجدية اللاتينية، كما هو موضح في الجدول أدناه. يمكن أن تسبب هذه الفجوات
المضاعفات.
قد تكون بعض مجموعات أحرف IBM EBCDIC معروفة بأرقام تعريف مجموعة رموز الأحرف
(أرقام CCSID) أو أرقام صفحات الرموز.
يمكن تجميع لغة Perl على الأنظمة الأساسية التي تشغل أيًا من أحرف EBCDIC الثلاثة شائعة الاستخدام
مجموعات، المذكورة أدناه.
إنّ كافة أنواع عهود الـ 13 البديل الأحرف
من بين مجموعات رموز أحرف IBM EBCDIC، هناك 13 حرفًا يتم تعيينها غالبًا
قيم صحيحة مختلفة. تُعرف هذه الأحرف بالأحرف "المتنوعة" الثلاثة عشر و
هي:
\ [ ] { } ^ ~ ! # | $@`
عندما يتم تجميع لغة Perl لمنصة ما، فإنها تنظر إلى كل هذه الأحرف لتخمين أي منها
مجموعة أحرف EBCDIC تستخدم النظام الأساسي، وتتكيف وفقًا لذلك النظام الأساسي.
إذا كان النظام الأساسي يستخدم مجموعة أحرف ليست من بين مجموعة الأحرف الثلاثة التي يعرفها Perl، فإن Perl
إما أن يفشل في التجميع، أو يختار عن طريق الخطأ وبصمت واحدًا من الثلاثة.
EBCDIC الكود اطقم كامله المعترف بها by بيرل
0037
معرف مجموعة رموز الأحرف 0037 عبارة عن تعيين لأحرف ASCII بالإضافة إلى أحرف Latin-1 (أي ISO
8859-1) إلى مجموعة EBCDIC. يتم استخدام 0037 في لغات أمريكا الشمالية الإنجليزية على
نظام التشغيل OS/400 الذي يعمل على أجهزة الكمبيوتر AS/400. يختلف CCSID 0037 عن ISO
8859-1 في 236 مكانًا؛ وبعبارة أخرى، فإنهم يتفقون على 20 قيمة لنقطة التشفير فقط.
1047
معرف مجموعة رموز الأحرف 1047 هو أيضًا تعيين لأحرف ASCII بالإضافة إلى أحرف Latin-1
(أي ISO 8859-1) إلى مجموعة EBCDIC. يتم استخدام 1047 ضمن خدمات نظام Unix لـ
OS/390 أو z/OS، وOpenEdition لـ VM/ESA. يختلف CCSID 1047 عن CCSID 0037
ثمانية مراكز، ومن ISO 8859-1 في 236.
بوسيكس-قبل الميلاد
تختلف صفحة الرموز EBCDIC المستخدمة في نظام Siemens BS2000 عن 1047 و0037.
تم تحديدها أدناه على أنها مجموعة POSIX-BC. مثل 0037 و1047، فهو نفس ISO
8859-1 في 20 قيمة لنقطة الكود.
يونيكود الكود نقطة مقابل EBCDIC الكود نقطة
في مصطلحات Unicode أ الكود نقطة هو الرقم المخصص للحرف: على سبيل المثال، في
EBCDIC عادةً ما يتم تعيين الرقم 193 للحرف "A". في Unicode، يتم تعيين الحرف
تم تعيين الرقم 65 لـ "A". جميع نقاط الرمز في ASCII وLatin-1 (ISO 8859-1) لها
نفس المعنى في Unicode. تحتوي جميع مجموعات رموز EBCDIC الثلاثة المعترف بها على 256 رمزًا
النقاط، وفي كل مجموعة رموز، يتم تعيين جميع نقاط التعليمات البرمجية البالغ عددها 256 إلى رمز Latin1 المكافئ
نقاط. من الواضح أن "A" سيتم تعيينه إلى "A"، "B" => "B"، "%" => "%"، وما إلى ذلك، لجميع المواد القابلة للطباعة
الأحرف في Latin1 وصفحات الرموز هذه.
وتبين أيضًا أن EBCDIC لديها معادلات دقيقة تقريبًا لـ ASCII/Latin1 C0
عناصر التحكم والتحكم DELETE. (عناصر التحكم C0 هي تلك التي تكون نقاط رمز ASCII الخاصة بها
0..0x1F؛ أشياء مثل TAB، وACK، وBEL، وما إلى ذلك) يتم إعداد التعيين بين ASCII/EBCDIC
ضوابط. لا يوجد مثل هذا التعيين الدقيق بين عناصر التحكم C1 على منصات ASCII
وضوابط EBCDIC المتبقية. ما تم فعله هو رسم خريطة لهذه الضوابط في الغالب
بشكل تعسفي، لبعض الأحرف التي لا مثيل لها في مجموعة الأحرف الأخرى. معظم
نادرًا ما يتم استخدام هذه في الوقت الحاضر في EBCDIC على أي حال، وقد كانت أسمائهم
انخفض، دون الكثير من الشكوى. على سبيل المثال، التحكم EO (ثمانية الآحاد) EBCDIC
(المكونة من ثمانية بتات واحدة = 0xFF) يتم تعيينها إلى عنصر التحكم C1 APC (0x9F)، وأنت
لا يمكن استخدام الاسم "EO".
توفر عناصر التحكم EBCDIC ثلاثة أحرف فاصلة محتملة للسطر، CR (0x0D)، LF
(0x25)، وNL (0x15). في منصات ASCII، يشير الرمزان "NL" و"LF" إلى نفس الشيء
شخصية، ولكن في مصطلحات EBCDIC الصارمة فهي مختلفة. EBCDIC NL هو
تم تعيينه إلى عنصر التحكم C1 المسمى "NEL" ("السطر التالي"؛ إليك حالة حيث يجعل التعيين
إلى حد كبير من المعنى، وبالتالي ليس مجرد تعسفي). على بعض منصات EBCDIC، هذا NL
أو NEL هو فاصل الخط النموذجي. وينطبق هذا على z/OS وBS2000. في هذه
الأنظمة الأساسية، سيقوم مترجمو C بتبديل نقاط الكود LF وNEL، بحيث يكون "\n" هو 0x15، و
يشير إلى NL. بيرل يفعل ذلك أيضًا؛ يمكنك رؤيته في مخطط الكود أدناه. هذا يجعل
الأشياء بشكل عام "تعمل فقط" دون الحاجة إلى أن تكون على علم بوجود مقايضة.
يونيكود و UTF
UTF يرمز إلى "تنسيق تحويل Unicode". UTF-8 هو ترميز Unicode إلى ملف
تسلسل قطع بايت ذات 8 بتات، استنادًا إلى ASCII وLatin-1. طول التسلسل
المطلوبة لتمثيل نقطة رمز Unicode يعتمد على الرقم الترتيبي لهذا الرمز
نقطة، مع أعداد أكبر تتطلب المزيد من البايتات. UTF-EBCDIC يشبه UTF-8، ولكنه يعتمد عليه
EBCDIC. إنهما متشابهان بما فيه الكفاية لدرجة أن الاستخدام غير الرسمي في كثير من الأحيان سوف يخلط بين المصطلحين، و
استخدم "UTF-8" ليعني كلاً من UTF-8 الموجود على منصات ASCII، وUTF-EBCDIC الموجود على
EBCDIC منها.
قد ترى مصطلح الحرف "الثابت" أو نقطة التعليمات البرمجية. وهذا يعني ببساطة أن
الحرف له نفس القيمة الرقمية والتمثيل عند ترميزه بـ UTF-8 (أو UTF-
EBCDIC) كما هو الحال عندما لا. (لاحظ أن هذا مفهوم مختلف تمامًا عن "الصيغة 13".
الأحرف" المذكورة أعلاه. سيستخدم النثر الدقيق المصطلح "UTF-8 الثابت" بدلاً من
فقط "ثابت"، ولكن في أغلب الأحيان سترى فقط "ثابت".) على سبيل المثال، الترتيبي
قيمة "A" هي 193 في معظم صفحات رموز EBCDIC، وهي أيضًا 193 عند ترميزها في UTF-EBCDIC.
تشغل جميع نقاط التعليمات البرمجية المتغيرة UTF-8 (أو UTF-EBCDIC) بايتين على الأقل عند تشفيرها
UTF-8 (أو UTF-EBCDIC)؛ بحكم التعريف، فإن نقاط الكود الثابتة UTF-8 (أو UTF-EBCDIC) هي
بايت واحد بالضبط سواء تم ترميزه بـ UTF-8 (أو UTF-EBCDIC)، أم لا. (الآن عرفت السبب
عادةً ما يقول الأشخاص "UTF-8" عندما يقصدون أيضًا "UTF-EBCDIC". لبقية هذا
document، سنكون في الغالب غير رسميين بشأن هذا الأمر أيضًا.) في ASCII UTF-8، يشير الرمز
المقابلة لأدنى 128 رقم ترتيبي (0 - 127: أحرف ASCII) هي
ثابت. في UTF-EBCDIC، هناك 160 حرفًا ثابتًا. (إذا كنت مهتمًا، فإن EBCDIC
الثوابت هي تلك الأحرف التي لها مكافئات ASCII، بالإضافة إلى تلك التي تتوافق معها
إلى عناصر التحكم C1 (128 - 159 على منصات ASCII).)
قد تكون السلسلة المشفرة في UTF-EBCDIC أطول (ولكنها ليست أقصر أبدًا) من السلسلة المشفرة
ترميز UTF-8. يقوم Perl بتوسيع UTF-8 بحيث يمكنه تشفير نقاط الكود أعلى من الحد الأقصى لـ Unicode
يو+10FFFF. وهو يمتد أيضًا إلى UTF-EBCDIC، ولكن نظرًا للقيود المتأصلة في UTF-
EBCDIC، الحد الأقصى لنقطة الرمز القابلة للتعبير عنها هو U+7FFF_FFFF، حتى لو كان حجم الكلمة أكبر
من 32 بت.
يتم تعريف UTF-EBCDIC بواسطة تقرير Unicode الفني رقم 16
<http://www.unicode.org/reports/tr16>. يتم تعريفه بناءً على CCSID 1047، ولا يسمح بذلك
للاختلافات لصفحات التعليمات البرمجية الأخرى. وهذا يسمح بتبادل النص بسهولة
بين أجهزة الكمبيوتر التي تشغل صفحات رموز مختلفة، ولكنها تجعلها غير قابلة للاستخدام، دون تعديل،
لـ Perl على صفحات الرموز الأخرى تلك.
سبب عدم قابلية الاستخدام هذا هو أن الافتراض الأساسي لـ Perl هو أن
الأحرف التي يهتم بها للتحليل والتحليل المعجمي هي نفسها سواء كانت
النص موجود بالترميز UTF-8. على سبيل المثال، يتوقع Perl أن يكون للحرف "[" نفس الشيء
التمثيل، بغض النظر عما إذا كانت السلسلة التي تحتوي عليه (أو نص البرنامج) مشفرة بـ UTF-8
أم لا. ولضمان ذلك، يقوم Perl بتكييف UTF-EBCDIC مع صفحة الرموز المحددة بحيث يمكن لجميع
الأحرف التي تتوقع أن تكون UTF-8 ثابتة هي في الواقع UTF-8 ثابتة. هذا يعني ذاك
يجب ترجمة النص الذي تم إنشاؤه على جهاز كمبيوتر يقوم بتشغيل إصدار واحد من UTF-EBCDIC الخاص بـ Perl
لتكون واضحة لجهاز كمبيوتر يقوم بتشغيل جهاز آخر.
باستخدام ترميز
بدءًا من Perl 5.8، يمكنك استخدام الوحدة القياسية Encode للترجمة من EBCDIC إلى
نقاط الكود اللاتينية-1. يعرف Encode عددًا أكبر من مجموعات أحرف EBCDIC مقارنةً بـ Perl
يتم تجميعها حاليًا للتشغيل.
استخدم التشفير "from_to"؛
%ebcdic = ( 176 => 'cp37', 95 => 'cp1047', 106 => 'posix-bc' );
# $a موجود في نقاط كود EBCDIC
from_to($a, $ebcdic{ord '^'}, 'latin1');
# $a هي نقاط ترميز ISO 8859-1
ومن نقاط كود Latin-1 إلى نقاط كود EBCDIC
استخدم التشفير "from_to"؛
%ebcdic = ( 176 => 'cp37', 95 => 'cp1047', 106 => 'posix-bc' );
# $a هي نقاط ترميز ISO 8859-1
from_to($a, 'latin1', $ebcdic{ord '^'});
# $a موجود في نقاط كود EBCDIC
لإجراء عمليات الإدخال/الإخراج، يُقترح استخدام ميزات الترجمة التلقائية لـ PerlIO، راجع
com.perluniintro.
منذ الإصدار 5.8، يستخدم Perl مكتبة PerlIO I/O. وهذا يتيح لك استخدام مختلف
الترميزات لكل قناة IO. على سبيل المثال يمكنك استخدام
استخدام التشفير
open($f, ">:encoding(ascii)", "test.ascii");
اطبع $f "Hello World!\n";
open($f, ">:encoding(cp37)", "test.ebcdic");
اطبع $f "Hello World!\n";
open ($ f، ">: encoding (latin1)"، "test.latin1")؛
اطبع $f "Hello World!\n";
open($f, ">:encoding(utf8)", "test.utf8");
اطبع $f "Hello World!\n";
للحصول على أربعة ملفات تحتوي على "Hello World!\n" بتنسيق ASCII، CP 0037 EBCDIC، ISO 8859-1
(لاتيني-1) (في هذا المثال مطابق لـ ASCII حيث تمت طباعة أحرف ASCII فقط)،
وUTF-EBCDIC (في هذا المثال مطابق لـ EBCDIC العادي نظرًا لأن الأحرف فقط
لا تختلف بين EBCDIC وUTF-EBCDIC تم طباعتها). انظر توثيق
ترميز::PerliIO للحصول على التفاصيل.
نظرًا لأن طبقة PerlIO تستخدم عمليات الإدخال والإخراج الأولية (البايتات) داخليًا، فإن كل هذا يتجاهل تمامًا أشياء مثل
نوع نظام الملفات لديك (ASCII أو EBCDIC).
وحيدة BYTE الجداول
تسرد الجداول التالية المجموعات المرتبة ASCII وLatin 1 بما في ذلك المجموعات الفرعية: C0
عناصر التحكم (0..31)، ورسومات ASCII (32..7e)، والحذف (7f)، وعناصر التحكم C1 (80..9f)، واللاتينية-1
(المعروف أيضًا باسم ISO 8859-1) (a0..ff). في أسماء الجداول لامتدادات Latin 1 إلى ASCII
تم تصنيفها بأسماء أحرف تتوافق تقريبًا مع إنّ كافة أنواع عهود الـ يونيكود المعيار، التجريبية
6.1 وإن كان ذلك مع بدائل مثل "s/LATIN//" و"s/VULGAR//" في جميع الحالات؛
"s/CAPITAL LETTER//" في بعض الحالات؛ و"s/SMALL LETTER ([AZ])/\l$1/" في بعض الكلمات الأخرى
حالات. يتم سرد عناصر التحكم باستخدام اختصارات Unicode 6.2 الخاصة بها. اوجه الاختلاف
بين المجموعتين 0037 و1047 يتم وضع علامة "**". الاختلافات بين 1047
ويتم وضع علامة على مجموعات POSIX-BC بـ "##". كافة أرقام "ord()" المدرجة عشرية. اذا أنت
تفضل رؤية هذا الجدول يسرد القيم الثمانية، ثم قم بتشغيل الجدول (أي pod
النص المصدر لهذا المستند، نظرًا لأن هذه الوصفة قد لا تعمل مع pod2_other_format
الترجمة) من خلال:
وصفة 0
بيرل -ne 'if(/(.{29})(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/)' \
-e '{printf("%s%-5.03o%-5.03o%-5.03o%.03o\n",$1,$2,$3,$4,$5)}' \
perlebcdic.pod
إذا كنت تريد الاحتفاظ بنقاط رمز UTF-x، فقد ترغب في كتابة النص في شكل البرنامج النصي:
وصفة 1
فتح (ف،"
بينما ( ) {
إذا (/(.{29})(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\.?(\d*)
\s+(\d+)\.?(\d*)/x)
{
إذا ($7 ني '' && 9 دولار ني '') {
printf (
"%s%-5.03o%-5.03o%-5.03o%-5.03o%-3o.%-5o%-3o.%.03o\n",
$1,$2,$3,$4,$5,$6,$7,$8,$9);
}
إلسيف ($7 ني '') {
printf("%s%-5.03o%-5.03o%-5.03o%-5.03o%-3o.%-5o%.03o\n",
$1,$2,$3,$4,$5,$6,$7,$8);
}
آخر {
printf("%s%-5.03o%-5.03o%-5.03o%-5.03o%-5.03o%.03o\n",
$1,$2,$3,$4,$5,$6,$8);
}
}
}
إذا كنت تفضل رؤية هذا الجدول يسرد القيم السداسية العشرية، فقم بتشغيل الجدول من خلال:
وصفة 2
بيرل -ne 'if(/(.{29})(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/)' \
-e '{printf("%s%-5.02X%-5.02X%-5.02X%.02X\n",$1,$2,$3,$4,$5)}' \
perlebcdic.pod
أو، من أجل الاحتفاظ بنقاط كود UTF-x بالنظام الست عشري:
وصفة 3
فتح (ف،"
بينما ( ) {
إذا (/(.{29})(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\.?(\d*)
\s+(\d+)\.?(\d*)/x)
{
إذا ($7 ني '' && 9 دولار ني '') {
printf (
"%s%-5.02X%-5.02X%-5.02X%-5.02X%-2X.%-6.02X%02X.%02X\n",
$1,$2,$3,$4,$5,$6,$7,$8,$9);
}
إلسيف ($7 ني '') {
printf("%s%-5.02X%-5.02X%-5.02X%-5.02X%-2X.%-6.02X%02X\n",
$1,$2,$3,$4,$5,$6,$7,$8);
}
آخر {
printf("%s%-5.02X%-5.02X%-5.02X%-5.02X%-5.02X%02X\n",
$1,$2,$3,$4,$5,$6,$8);
}
}
}
ISO
8859-1 نقطة البيع-CCSID
CCSID CCSID CCSID التاسع-1047
مركز حقوق الإنسان 0819 0037 1047 قبل الميلاد UTF-8 UTF-EBCDIC
-------------------------------------------------- -------------------
0 0 0 0 0 0
1 1 1 1 1 1
2 2 2 2 2 2
3 3 3 3 3 3
4 55 55 55 4 55
5 45 45 45 5 45
6 46 46 46 6 46
7 47 47 47 7 47
8 22 22 22 8 22
9 5 5 5 9 5
10 37 21 21 10 21 **
11 11 11 11 11 11
12 12 12 12 12 12
13 13 13 13 13 13
14 14 14 14 14 14
15 15 15 15 15 15
16 16 16 16 16 16
1 17 17 17 17 17
2 18 18 18 18 18
3 19 19 19 19 19
4 20 60 60 60 20
21 61 61 61 21 61
22 50 50 50 22 50
23 38 38 38 23 38
24 24 24 24 24 24
25 25 25 25 25 25
26 63 63 63 26 63
27 39 39 39 27 39
28 28 28 28 28 28
29 29 29 29 29 29
30 30 30 30 30 30
31 31 31 31 31 31
32 64 64 64 32 64
! 33 90 90 90 33 90
" 34 127 127 127 34 127
# 35 123 123 123 35 123
36 91 91 91 36 91 دولار
% 37 108 108 108 37 108
& 38 80 80 80 38 80
' 39 125 125 125 39 125
( 40 77 77 77 40 77
) 41 93 93 93 41 93
* 42 92 92 92 42 92
+ 43 78 78 78 43 78
، 44 107 107 107 44 107
- 45 96 96 96 45 96
. 46 75 75 75 46
/ 47 97 97 97 47 97
0 48 240 240 240 48 240
1 49 241 241 241 49 241
2 50 242 242 242 50 242
3 51 243 243 243 51 243
4 52 244 244 244 52 244
5 53 245 245 245 53 245
6 54 246 246 246 54 246
7 55 247 247 247 55 247
8 56 248 248 248 56 248
9 57 249 249 249 57 249
: 58 122 122 122 58
; 59 94 94 94 59 94
<60 76 76 76 60 76
= 61 126 126 126 61 126
> 62 110 110 110 62 110
؟ 63 111 111 111 63 111
@ 64 124 124 124 64 124
أ 65 193 193 193 65 193
ب 66 194 194 194 66 194
ج 67 195 195 195 67 195
د 68 196 196 196 68 196
ه 69 197 197 197 69 197
إناث 70 198 198 198 70 198
ز 71 199 199 199 71 199
ح 72 200 200 200 72 200
أنا 73 201 201 201 73 201
ج 74 209 209 209 74 209
ك 75
76
م 77 212 212 212 77 212
ن 78 213 213 213 78 213
او 79
ص 80
س 81 216 216 216 81 216
ر 82 217 217 217 82 217
س 83 226 226 226 83 226
هاتف 84
ش 85 228 228 228 85 228
الخامس 86 229 229 229 86 229
ث 87 230 230 230 87 230
× 88 231 231 231 88 231
ص 89 232 232 232 89 232
ض 90 233 233 233 90 233
[ 91 186 173 187 91 173 ** ##
\ 92 224 224 188 92 224 ##
] 93 187 189 189 93 189 **
^ 94 176 95 106 94 95 ** ##
_ 95 109 109 109 95 109
` 96 121 121 74 96 121 ##
أ 97 129 129 129 97 129
ب 98 130 130 130 98 130
ج 99
د 100 132 132 132 100 132
101 133 133 133 101 133
و 102 134 134 134 102 134
ز 103 135 135 135 103 135
ح 104 136 136 136 104 136
ط 105 137 137 137 105 137
ي 106 145 145 145 106 145
ك 107 146 146 146 107 146
ل 108 147 147 147 108
م 109 148 148 148 109 148
ن 110 149 149 149 110 149
س 111 150 150 150 111 150
ص 112 151 151 151 112 151
ف 113 152 152 152 113 152
ص 114 153 153 153 114 153
ق 115 162 162 162 115 162
ر 116 163 163 163 116 163
ش 117 164 164 164 117 164
ضد 118 165 165 165 118 165
ث 119 166 166 166 119 166
x 120 167
ص 121 168 168 168 121 168
ض 122 169 169 169 122 169
{ 123 192 192 251 123 192 ##
| 124 79 79 79 124 79
} 125 208 208 253 125 208 ##
~ 126 161 161 255 126 161 ##
127 7 7 7 127 7
128 32 32 32 194.128 32
129 33 33 33 194.129 33
130 34 34 34 194.130 34
131 35 35 35 194.131 35
132 36 36 36 194.132 36
133 21 37 37 194.133 37 **
134 6 6 6 194.134 6
135 23 23 23 194.135 23
136 40 40 40 194.136 40
137 41 41 41 194.137 41
138 42 42 42 194.138 42
139 43 43 43 194.139 43
140 44 44 44 194.140 44
141 9 9 9 194.141 9
2 142 10 10 10 194.142
3 143 27 27 27 194.143
144 48 48 48 194.144 48
1 145 49 49 49 194.145
2 146 26 26 26 194.146
147 51 51 51 194.147 51
148 52 52 52 194.148 52
149 53 53 53 194.149 53
150 54 54 54 194.150 54
151 8 8 8 194.151 8
152 56 56 56 194.152 56
153 57 57 57 194.153 57
154 58 58 58 194.154 58
155 59 59 59 194.155 59
156 4 4 4 194.156 4
157 20 20 20 194.157 20
158 62 62 62 194.158 62
159 255 255 95 194.159 255 ##
160 65 65 65 194.160 128.65
161 170 170 170 194.161 128.66
162 74 74 176 194.162 128.67 ##
163 177 177 177 194.163 128.68
164 159 159 159 194.164 128.69
165 178 178 178 194.165 128.70
166 106 106 208 194.166 128.71 ##
167 181 181 181 194.167 128.72
168 189 187 121 194.168 128.73 ** ##
169 180 180 180 194.169 128.74
170 154 154 154 194.170 128.81
171 138 138 138 194.171 128.82
172 95 176 186 194.172 128.83 ** ##
173 202 202 202 194.173 128.84
174 175 175 175 194.174 128.85
175 188 188 161 194.175 128.86 ##
176 144 144 144 194.176 128.87
177 143 143 143 194.177 128.88
178 234 234 234 194.178 128.89
179 250 250 250 194.179 128.98
180 190 190 190 194.180 128.99
181 160 160 160 194.181 128.100
182 182 182 182 194.182 128.101
183 179 179 179 194.183 128.102
184 157 157 157 194.184 128.103
185 218 218 218 194.185 128.104
186 155 155 155 194.186 128.105
187 139 139 139 194.187 128.106
188 183 183 183 194.188 128.112
189 184 184 184 194.189 128.113
190 185 185 185 194.190 128.114
191 171 171 171 194.191 128.115
192 100 100 100 195.128 138.65
193 101 101 101 195.129 138.66
194 98 98 98 195.130 138.67
195 102 102 102 195.131 138.68
196 99 99 99 195.132 138.69
197 103 103 103 195.133 138.70
198 158 158 158 195.134 138.71
199 104 104 104 195.135 138.72
200 116 116 116 195.136 138.73
201 113 113 113 195.137 138.74
202 114 114 114 195.138 138.81
203 115 115 115 195.139 138.82
204 120 120 120 195.140 138.83
205 117 117 117 195.141 138.84
206 118 118 118 195.142 138.85
207 119 119 119 195.143 138.86
208 172 172 172 195.144 138.87
209 105 105 105 195.145 138.88
210 237 237 237 195.146 138.89
211 238 238 238 195.147 138.98
212 235 235 235 195.148 138.99
213 239 239 239 195.149 138.100
214 236 236 236 195.150 138.101
215 191 191 191 195.151 138.102
216 128 128 128 195.152 138.103
217 253 253 224 195.153 138.104 ##
218 254 254 254 195.154 138.105
219 251 251 221 195.155 138.106 ##
220 252 252 252 195.156 138.112
221 173 186 173 195.157 138.113 ** ##
222 174 174 174 195.158 138.114
223 89 89 89 195.159 138.115
224 68 68 68 195.160 139.65
225 69 69 69 195.161 139.66
226 66 66 66 195.162 139.67
227 70 70 70 195.163 139.68
228 67 67 67 195.164 139.69
229 71 71 71 195.165 139.70
230 156 156 156 195.166 139.71
231 72 72 72 195.167 139.72
232 84 84 84 195.168 139.73
233 81 81 81 195.169 139.74
234 82 82 82 195.170 139.81
235 83 83 83 195.171 139.82
236 88 88 88 195.172 139.83
237 85 85 85 195.173 139.84
238 86 86 86 195.174 139.85
239 87 87 87 195.175 139.86
240 140 140 140 195.176 139.87
241 73 73 73 195.177 139.88
242 205 205 205 195.178 139.89
243 206 206 206 195.179 139.98
244 203 203 203 195.180 139.99
245 207 207 207 195.181 139.100
246 204 204 204 195.182 139.101
247 225 225 225 195.183 139.102
248 112 112 112 195.184 139.103
249 221 221 192 195.185 139.104 ##
250 222 222 222 195.186 139.105
251 219 219 219 195.187 139.106
252 220 220 220 195.188 139.112
253 141 141 141 195.189 139.113
254 142 142 142 195.190 139.114
255 223 223 223 195.191 139.115
إذا كنت تفضل رؤية الجدول أعلاه بترتيب CCSID 0037 بدلاً من ASCII + Latin-1
اطلب ثم قم بتشغيل الجدول من خلال:
وصفة 4
بيرل \
-ني 'إذا(/.{29}\d{1,3}\s{2,4}\d{1,3}\s{2,4}\d{1,3}\s{2,4}\d{1,3}/)'\
-e '{push(@l,$_)}' \
-e 'END{طباعة الخريطة{$_->[0]}' \
-e ' فرز{$a->[1] <=> $b->[1]}' \
-e ' خريطة {[$_,substr($_,34,3)]}@l;}' perlebcdic.pod
إذا كنت تفضل رؤيته بترتيب CCSID 1047، فقم بتغيير الرقم 34 في السطر الأخير
إلى 39، هكذا:
وصفة 5
بيرل \
-ني 'إذا(/.{29}\d{1,3}\s{2,4}\d{1,3}\s{2,4}\d{1,3}\s{2,4}\d{1,3}/)'\
-e '{push(@l,$_)}' \
-e 'END{طباعة الخريطة{$_->[0]}' \
-e ' فرز{$a->[1] <=> $b->[1]}' \
-e ' خريطة {[$_,substr($_,39,3)]}@l;}' perlebcdic.pod
إذا كنت تفضل رؤيته بترتيب POSIX-BC، فقم بتغيير الرقم 34 في السطر الأخير إلى
44 مثل هذا:
وصفة 6
بيرل \
-ني 'إذا(/.{29}\d{1,3}\s{2,4}\d{1,3}\s{2,4}\d{1,3}\s{2,4}\d{1,3}/)'\
-e '{push(@l,$_)}' \
-e 'END{طباعة الخريطة{$_->[0]}' \
-e ' فرز{$a->[1] <=> $b->[1]}' \
-e ' خريطة {[$_,substr($_,44,3)]}@l;}' perlebcdic.pod
طاولات in عرافة، فرز in 1047 طلب
منذ أن تمت كتابة هذه الوثيقة لأول مرة، أصبح استخدام الاتفاقية أكثر فأكثر
تدوين سداسي عشري لنقاط الكود. للقيام بذلك مع الوصفات والفرز أيضًا هو
عملية متعددة الخطوات، لذلك هنا، من أجل الراحة، يتم إعادة ترتيب الجدول من الأعلى ليكون فيه
ترتيب صفحة التعليمات البرمجية 1047، واستخدام التدوين السداسي.
ISO
8859-1 نقطة البيع-CCSID
CCSID CCSID CCSID التاسع-1047
مركز حقوق الإنسان 0819 0037 1047 قبل الميلاد UTF-8 UTF-EBCDIC
-------------------------------------------------- -------------------
00 00 00 00 00 00
01 01 01 01 01 01
02 02 02 02 02 02
03 03 03 03 03 03
9C 04 04 04 C2.9C 04
09 05 05 05 09 05
86 06 06 06 ج2.86 06
7ف 07 07 07 7ف 07
97 08 08 08 C2.97 08
8 د 09 09 09 C2.8D 09
2E 8A 0A 0A C0E 2.8A
0ب 0ب 0ب 0ب 0ب 0ب
0ج 0ج 0ج 0ج 0ج 0ج
0د 0د 0د 0د 0د 0د
0E 0E 0E 0E 0E 0E
0ف 0ف 0ف 0ف 0ف 0ف
10 10 10 10 10 10
1 11 11 11 11 11
2 12 12 12 12 12
3 13 13 13 13 13
9د 14 14 14 ج2.9د 14
0أ 25 15 15 0أ 15 **
08 16 16 16 08 16
87 17 17 17 ج2.87 17
18 18 18 18 18 18
19 19 19 19 19 19
2 92A 1A 1A C1 2.92A
3F 8B 1B 1B C1F 2.8B
1ج 1ج 1ج 1ج 1ج 1ج
1د 1د 1د 1د 1د 1د
1هـ 1هـ1هـ1هـ1هـ1هـ
1ف 1ف 1ف 1ف 1ف 1ف
80 20 20 20 ج2.80 20
81 21 21 21 ج2.81 21
82 22 22 22 ج2.82 22
83 23 23 23 ج2.83 23
84 24 24 24 ج2.84 24
85 15 25 25 ج2.85 25 **
17 26 26 26 17 26
1 ب 27 27 27 1 ب 27
88 28 28 28 ج2.88 28
89 29 29 29 ج2.89 29
8A 2A 2A 2A C2.8A 2A
8 ب 2 ب 2 ب 2 ب C2.8 ب 2 ب
8C 2C 2C 2C C2.8C 2C
05 2D 2D 2D 05 2D
06 2ه 2ه 2ه 06 2ه
07 2ف 2ف 2ف 07 2ف
90 30 30 30 ج2.90 30
1 91 31 31 ج31 2.91
16 32 32 32 16 32
93 33 33 33 ج2.93 33
94 34 34 34 ج2.94 34
95 35 35 35 ج2.95 35
96 36 36 36 ج2.96 36
04 37 37 37 04 37
98 38 38 38 ج2.98 38
99 39 39 39 ج2.99 39
9A 3A 3A 3A C2.9A 3A
9 ب 3 ب 3 ب 3 ب C2.9 ب 3 ب
4 14ج 3ج 3ج 3 14ج
15 3D 3D 3D 15 3D
9E 3E 3E 3E C2.9E 3E
1أ 3ف 3ف 3ف 1أ 3ف
20 40 40 40 20 40
أ0 41 41 41 C2.A0 80.41
E2 42 42 42 C3.A2 8B.43
E4 43 43 43 C3.A4 8B.45
E0 44 44 44 C3.A0 8B.41
E1 45 45 45 C3.A1 8B.42
E3 46 46 46 C3.A3 8B.44
E5 47 47 47 C3.A5 8B.46
E7 48 48 48 C3.A7 8B.48
F1 49 49 49 C3.B1 8B.58
A2 4A 4A B0 C2.A2 80.43 ##
. 2ه 4 ب 4 ب 4 ب 2 ه 4 ب
< 3ج 4ج 4ج 4ج 3ج 4ج
(28 4 د 4 د 4 د 28 4 د
+ 2ب 4ه 4ه 4ه 2ب 4ه
| 7ج 4ف 4ف 4ف 7ج 4ف
& 26 50 50 50 26 50
E9 51 51 51 C3.A9 8B.4A
إي 52 52 52 C3.AA 8B.51
إب 53 53 53 C3.AB 8B.52
E8 54 54 54 C3.A8 8B.49
إد 55 55 55 C3.AD 8B.54
إي 56 56 56 C3.AE 8B.55
إي إف 57 57 57 C3.AF 8B.56
إيك 58 58 58 C3.AC 8B.53
DF 59 59 59 C3.9F 8A.73
! 21 5 أ 5 أ 5 أ 21 5 أ
24 دولارًا 5 ب 5 ب 5 ب 24 5 ب
* 2A 5C 5C 5C 2A 5C
) 29 5 د 5 د 5 د 29 5 د
; 3ب 5هـ5هـ5هـ3ب5هـ
^ 5E B0 5F 6A 5E 5F ** ##
- 2د 60 60 60 2د 60
/ 2ف 61 61 61 2ف 61
C2 62 62 62 C3.82 8A.43
C4 63 63 63 C3.84 8A.45
C0 64 64 64 C3.80 8A.41
C1 65 65 65 C3.81 8A.42
C3 66 66 66 C3.83 8A.44
C5 67 67 67 C3.85 8A.46
C7 68 68 68 C3.87 8A.48
D1 69 69 69 C3.91 8A.58
A6 6A 6A D0 C2.A6 80.47 ##
, 2ج 6 ب 6 ب 6 ب 2 ج 6 ب
% 25 6ج 6ج 6ج 25 6ج
_ 5ف 6د 6د 6د 5ف 6د
> 3هـ6هـ6هـ6هـ3هـ6هـ
؟ 3ف 6ف 6ف 6ف 3ف 6ف
F8 70 70 70 C3.B8 8B.67
C9 71 71 71 C3.89 8A.4A
كاليفورنيا 72 72 72 C3.8A 8A.51
سي بي 73 73 73 C3.8B 8A.52
C8 74 74 74 C3.88 8A.49
قرص مضغوط 75 75 75 C3.8D 8A.54
سي 76 76 76 C3.8E 8A.55
CF 77 77 77 C3.8F 8A.56
CC 78 78 78 C3.8C 8A.53
` 60 79 79 4أ 60 79 ##
: 3A 7A 7A 7A 3A 7A
# 23 7 ب 7 ب 7 ب 23 7 ب
@ 40 7C 7C 7C 40 7C
'27 7 د 7 د 7 د 27 7 د
= 3D 7E 7E 7E 3D 7E
" 22 7ف 7ف 7ف 22 7ف
D8 80 80 80 C3.98 8A.67
أ 61 81 81 81 61 81
ب 62 82 82 82 62 82
ج 63
د 64 84 84 84 64 84
65 85 85 85 65 85
و 66 86 86 86 66 86
ز 67 87 87 87 67 87
ح 68 88 88 88 68 88
ط 69 89 89 89 69 89
أب 8A 8A 8A C2.AB 80.52
بي بي 8 بي 8 بي 8 بي سي 2. بي بي 80.6 أ
F0 8C 8C 8C C3.B0 8B.57
FD 8D 8D 8D C3.BD 8B.71
FE 8E 8E 8E C3.BE 8B.72
B1 8F 8F 8F C2.B1 80.58
ب0 90 90 90 C2.B0 80.57
ي 6 أ 91 91 91 6 أ 91
ك 6 ب 92 92 92 6 ب 92
ل 6ج 93 93 93 6ج 93
م 6 د 94 94 94 6 د 94
ن 6هـ 95 95 95 6هـ 95
6F 96 96 96 6F 96
ص 70 97 97 97 70 97
ف 71 98 98 98 71 98
ص 72 99 99 99 72 99
آ 9 أ 9 أ 9 أ C2.AA 80.51
با 9ب 9ب 9ب C2.BA 80.69
E6 9C 9C 9C C3.A6 8B.47
B8 9D 9D 9D C2.B8 80.67
C6 9E 9E 9E C3.86 8A.47
A4 9F 9F 9F C2.A4 80.45
B5 A0 A0 A0 C2.B5 80.64
~ 7E A1 A1 FF 7E A1 ##
ق 73 أ2 أ2 أ2 73 أ2
ر 74 أ3 أ3 أ3 74 أ3
ش 75 A4 A4 4 A75
ت 76 أ5 أ5 أ5 76 أ5
ث 77 أ6 أ6 أ6 77 أ6
× 78 A7 A7 A7 78 A7
ذ 79 أ8 أ8 أ8 79 أ8
ض 7A A9 A9 A9 7A A9
A1 AA AA AA C2.A1 80.42
فرنك بلجيكي AB AB C2.BF 80.73
D0 AC AC AC C3.90 8A.57
[ 5 ب با أد ب ب 5 ب م ** ##
دي AE AE C3.9E 8A.72
ايه اي ايه اف ايه اف C2.AE 80.55
ايه سي 5F بي0 بي ايه سي 2. ايه سي 80.53 ** ##
A3 B1 B1 B1 C2.A3 80.44
A5 B2 B2 B2 C2.A5 80.46
B7 B3 B3 B3 C2.B7 80.66
A9 B4 B4 B4 C2.A9 80.4A
A7 B5 B5 B5 C2.A7 80.48
B6 B6 B6 B6 C2.B6 80.65
قبل الميلاد B7 B7 B7 C2.BC 80.70
دينار بحريني B8 B8 B8 C2.BD 80.71
بي بي9 بي9 بي9 سي2.بي 80.72
DD AD BA AD C3.9D 8A.71 ** ##
A8 دينار بحريني 79 C2.A8 80.49 ** ##
AF قبل الميلاد قبل الميلاد A1 C2.AF 80.56 ##
] 5D BB BD 5D BD **
B4 BE BE C2.B4 80.63
D7 بف بف بف C3.97 8A.66
{ 7B C0 C0 فب 7B C0 ##
أ 41 ج1 ج1 ج1 41 ج1
ب 42 ج2 ج2 ج2 42 ج2
ج 43 ج3 ج3 ج3 43 ج3
د 44 ج 4 ج 4 ج 4 44 ج 4
ه 45 ج5 ج5 ج5 45 ج5
ف 46 ج6 ج6 ج6 46 ج6
جي 47 سي 7 سي 7 7 سي 47
ح 48 ج 8 ج 8 8 ج 48
أنا 49 C9 C9 C9 49 C9
AD CA CA CA C2.AD 80.54
F4 سي بي سي بي سي بي C3.B4 8B.63
F6 CC CC CC C3.B6 8B.65
F2 سي دي سي دي سي دي C3.B2 8B.59
F3 CE CE C3.B3 8B.62
F5 CF CF CF C3.B5 8B.64
} 7D D0 D0 FD 7D D0 ##
ي 4A D1 D1 D1 4A D1
ك 4 ب د2 د2 د2 4ب د2
ل 4C D3 D3 D3 4C D3
م 4D D4 D4 D4 4D D4
ن 4E D5 D5 D5 4E D5
يا 4F D6 D6 D6 4F D6
ف 50 د7 د7 د7 50 د7
س 51 د8 د8 د8 51 د8
ص 52 د9 د9 د9 52 د9
B9 دا دا دا C2.B9 80.68
إف بي دي بي دي بي دي بي C3.BB 8B.6A
FC DC DC DC C3.BC 8B.70
F9 DD DD C0 C3.B9 8B.68 ##
فا دي دي دي C3.BA 8B.69
FF DF DF DF C3.BF 8B.73
\ 5C E0 E0 قبل الميلاد 5C E0 ##
F7 E1 E1 E1 C3.B7 8B.66
س 53 ه 2 ه 2 2 ه 53
تي 54 ه 3 ه 3 3 ه 54
ش 55 ه 4 ه 4 4 ه 55
الخامس 56 E5 E5 E5 56 E5
ث 57 ه 6 ه 6 6 ه 57
× 58 إي 7 إي 7 إي 7 58 إي 7
ص 59 ه 8 ه 8 8 ه 59
ض 5A E9 E9 E9 5A E9
B2 EA EA C2.B2 80.59
D4 إب إب إب C3.94 8A.63
D6 إيك إيك إيك C3.96 8A.65
D2 ED ED C3.92 8A.59
D3 EE EE EE C3.93 8A.62
D5 EF EF EF C3.95 8A.64
0 30 F0 F0 F0 30 F0
1 31 F1 F1 F1 31 F1
2 32 F2 F2 F2 32 F2
3 33 F3 F3 F3 33 F3
4 34 F4 F4 F4 34 F4
5 35 F5 F5 F5 35 F5
6 36 F6 F6 F6 36 F6
7 37 F7 F7 F7 37 F7
8 38 F8 F8 F8 38 F8
9 39 F9 F9 F9 39 F9
B3 فا فا فا C2.B3 80.62
دي بي إف بي إف بي دي دي C3.9B 8A.6A ##
دي سي إف سي إف سي إف سي C3.9C 8A.70
D9 FD FD E0 C3.99 8A.68 ##
دا FE FE C3.9A 8A.69
9F FF FF 5F C2.9F FF ##
تحديد حرف CODE الاطقم
من الممكن تحديد مجموعة الأحرف التي تعمل ضمنها. ولكن أولا أنت
يجب أن تكون متأكدًا حقًا من أنك بحاجة إلى القيام بذلك. سيكون الكود الخاص بك أبسط وربما
تمامًا كما هو محمول إذا لم تكن مضطرًا إلى اختبار مجموعة الشخصيات والقيام بأشياء مختلفة،
اعتمادا. هناك في الواقع حالات قليلة جدًا حيث ليس من السهل الكتابة
كود الخط المستقيم قابل للنقل لجميع مجموعات الأحرف. راجع "Unicode وEBCDIC" في
perluniintro لكيفية تحديد الأحرف بشكل محمول.
ولكن هناك بعض الحالات التي قد ترغب فيها في معرفة مجموعة الأحرف التي تقوم بتشغيلها
تحت. أحد الأمثلة المحتملة هو إجراء الفرز في الحلقات الداخلية حيث يكون الأداء
حرج.
لتحديد ما إذا كنت تعمل ضمن ASCII أو EBCDIC، يمكنك استخدام قيمة الإرجاع الخاصة بـ
"ord()" أو "chr()" لاختبار قيمة حرف واحدة أو أكثر. على سبيل المثال:
$is_ascii = "أ" مكافئ مركز حقوق الإنسان(65)
$is_ebcdic = "أ" مكافئ مركز حقوق الإنسان(193)
$is_ascii = ord("A") == 65;
$is_ebcdic = ord("A") == 193;
هناك حاجة أقل للتمييز بين صفحات رموز EBCDIC، ولكن للقيام بذلك حاول البحث
في واحد أو أكثر من الشخصيات التي تختلف فيما بينها.
$is_ascii = ord('[') == 91;
$is_ebcdic_37 = ord('[') == 186;
$is_ebcdic_1047 = ord('[') == 173;
$is_ebcdic_POSIX_BC = ord('[') == 187;
ومع ذلك، سيكون من غير الحكمة كتابة اختبارات مثل:
$is_ascii = "\r" ني مركز حقوق الإنسان(13)؛ # خطأ
$is_ascii = "\n" ني مركز حقوق الإنسان(10)؛ # ينصح به
من الواضح أن أول هذه العناصر سوف يفشل في التمييز بين معظم منصات ASCII من أي منهما
CCSID 0037 أو 1047 أو نظام POSIX-BC EBCDIC منذ ""\r" مكافئ مركز حقوق الإنسان(١٣)" تحت الكل
مجموعات الأحرف المشفرة تلك. لكن لاحظ أيضًا أنه نظرًا لأن "\n" هو "مركز حقوق الإنسان(13)" و"\r" هو
"مركز حقوق الإنسان(10)" على جهاز Macintosh القديم (وهو منصة ASCII) سيتم إجراء اختبار $is_ascii الثاني
يؤدي إلى المتاعب هناك.
لتحديد ما إذا كان Perl قد تم إنشاؤه ضمن صفحة الرموز EBCDIC أم لا، يمكنك استخدام الملف
وحدة التكوين مثل ذلك:
استخدام التكوين ؛
$is_ebcdic = $Config{'ebcdic'} eq 'define';
التحويلات
"utf8::unicode_to_native()" و "utf8::native_to_unicode()"
تأخذ هذه الوظائف نقطة رمز رقمية مُدخلة في تشفير واحد وتعيد ما هي عليه
القيمة المعادلة في الآخر.
انظر UTF8.
آر ///
من أجل تحويل سلسلة من الأحرف من مجموعة أحرف إلى أخرى، قائمة بسيطة
من الأرقام، كما هو الحال في الأعمدة اليمنى في الجدول أعلاه، بالإضافة إلى "tr///" الخاص بـ Perl
المشغل هو كل ما هو مطلوب. البيانات الموجودة في الجدول مرتبة حسب ترتيب ASCII/Latin1
توفر أعمدة EBCDIC عمليات ASCII/Latin1 سهلة الاستخدام لعمليات EBCDIC التي يتم أيضًا
عكس بسهولة.
على سبيل المثال، لتحويل ASCII/Latin1 إلى صفحة الرموز 037، خذ مخرجات الثانية
عمود الأرقام من مخرجات الوصفة 2 (تم التعديل لإضافة أحرف "\")، واستخدامه في
"tr///" هكذا:
$cp_037 =
'\x00\x01\x02\x03\x37\x2D\x2E\x2F\x16\x05\x25\x0B\x0C\x0D\x0E\x0F' .
'\x10\x11\x12\x13\x3C\x3D\x32\x26\x18\x19\x3F\x27\x1C\x1D\x1E\x1F' .
'\x40\x5A\x7F\x7B\x5B\x6C\x50\x7D\x4D\x5D\x5C\x4E\x6B\x60\x4B\x61' .
'\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\x7A\x5E\x4C\x7E\x6E\x6F' .
'\x7C\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xD1\xD2\xD3\xD4\xD5\xD6' .
'\xD7\xD8\xD9\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xBA\xE0\xBB\xB0\x6D' .
'\x79\x81\x82\x83\x84\x85\x86\x87\x88\x89\x91\x92\x93\x94\x95\x96' .
'\x97\x98\x99\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xC0\x4F\xD0\xA1\x07' .
'\x20\x21\x22\x23\x24\x15\x06\x17\x28\x29\x2A\x2B\x2C\x09\x0A\x1B' .
'\x30\x31\x1A\x33\x34\x35\x36\x08\x38\x39\x3A\x3B\x04\x14\x3E\xFF' .
'\x41\xAA\x4A\xB1\x9F\xB2\x6A\xB5\xBD\xB4\x9A\x8A\x5F\xCA\xAF\xBC' .
'\x90\x8F\xEA\xFA\xBE\xA0\xB6\xB3\x9D\xDA\x9B\x8B\xB7\xB8\xB9\xAB' .
'\x64\x65\x62\x66\x63\x67\x9E\x68\x74\x71\x72\x73\x78\x75\x76\x77' .
'\xAC\x69\xED\xEE\xEB\xEF\xEC\xBF\x80\xFD\xFE\xFB\xFC\xAD\xAE\x59' .
'\x44\x45\x42\x46\x43\x47\x9C\x48\x54\x51\x52\x53\x58\x55\x56\x57' .
'\x8C\x49\xCD\xCE\xCB\xCF\xCC\xE1\x70\xDD\xDE\xDB\xDC\x8D\x8E\xDF';
$ebcdic_string = $ascii_string;
eval '$ebcdic_string =~ tr/\000-\377/' . $cp_037 . '/';
للتحويل من EBCDIC 037 إلى ASCII، ما عليك سوى عكس ترتيب الوسائط tr/// كما يلي:
$ascii_string = $ebcdic_string;
تقييم '$ascii_string =~ tr/' . $cp_037 . '/\000-\377/';
وبالمثل، يمكن للمرء أن يأخذ ناتج عمود الأرقام الثالث من الوصفة 2 للحصول على أ
جدول $cp_1047. يمكن أن يوفر عمود الأرقام الرابع للإخراج من الوصفة 2 أ
جدول $cp_posix_bc مناسب لتحويل الشفرة أيضًا.
إذا كنت تريد رؤية الجداول المعكوسة، فسيتعين عليك أولاً الفرز حسب ما تريد
عمود الأرقام كما في الوصفات 4 أو 5 أو 6، ثم خذ ناتج عمود الأرقام الأول.
iconv
غالبًا ما تشير قابلية تشغيل XPG إلى وجود ملف iconv الأداة المساعدة المتاحة من Shell أو
من مكتبة C. راجع وثائق النظام الخاص بك للحصول على معلومات حول Iconv.
على OS/390 أو z/OS، راجع ملف iconv(1) صفحة الإدارة. إحدى الطرق لاستدعاء الأداة المساعدة Shell "iconv".
من داخل بيرل سيكون:
# مثال OS/390 أو z/OS
$ascii_data = `echo '$ebcdic_data'| Iconv -f IBM-1047 -t ISO8859-1`
أو الخريطة العكسية:
# مثال OS/390 أو z/OS
$ebcdic_data = `echo '$ascii_data'| Iconv -f ISO8859-1 -t IBM-1047`
للحصول على خيارات التحويل الأخرى المستندة إلى لغة Perl، راجع وحدات "Convert::*" الموجودة على CPAN.
C RTL
توفر مكتبات وقت التشغيل OS/390 وz/OS C وظائف "_atoe()" و"_etoa()".
مشغل اختلافات
يتعامل مشغل النطاق ".." مع نطاقات أحرف معينة بعناية على منصات EBCDIC.
على سبيل المثال، ستحتوي المصفوفة التالية على ستة وعشرين عنصرًا على منصة EBCDIC
أو منصة ASCII:
@alphabet = ('أ'..'Z'); # $#الأبجدية == 25
عوامل تشغيل البت مثل & ^ | قد ترجع نتائج مختلفة عند العمل على السلسلة
أو بيانات الأحرف في برنامج Perl الذي يعمل على منصة EBCDIC مقارنةً بالتشغيل على منصة
منصة أسكي. فيما يلي مثال مقتبس من المثال الموجود في perlop:
# الأمثلة المستندة إلى EBCDIC
طباعة "jp \n" ^ "آه"؛ # طباعة "JAPH\n"
طباعة "جا" | "الرقم الهيدروجيني\n"; # طباعة "japh\n"
طباعة "JAPH\nJunk" و"\277\277\277\277\277"; # يطبع "japh\n"؛
اطبع 'p N $' ^ "E
من الخصائص المثيرة للاهتمام لأحرف التحكم 32 C0 في جدول ASCII أنها
يمكن إنشاؤها "حرفيًا" كأحرف تحكم في Perl، على سبيل المثال "(مركز حقوق الإنسان(0)" مكافئ "\c@")>
"(مركز حقوق الإنسان(1)" eq "\cA")>، وهكذا. تم نقل لغة Perl الموجودة على منصات EBCDIC لتأخذ "\c@"
إلى مركز حقوق الإنسان(0) و "\cA" إلى مركز حقوق الإنسان(١) إلى آخره أيضًا، لكن الحروف الناتجة تعتمد عليها
صفحة الرموز التي تستخدمها. يستخدم الجدول أدناه الاختصارات القياسية لـ
ضوابط. تتطابق مجموعات POSIX-BC و1047 في هذا النطاق وتختلف عن بعضها البعض
تم تعيين 0037 في نقطة واحدة فقط (21 علامة عشرية). لاحظ أن حرف فاصل السطر قد يكون
يتم إنشاؤها بواسطة "\cJ" على منصات ASCII ولكن بواسطة "\cU" على منصات 1047 أو POSIX-BC و
لا يمكن إنشاء "\c.letter." شخصية التحكم على منصات 0037. لاحظ ذلك أيضًا
لا يمكن أن يكون "\c\" هو العنصر الأخير في سلسلة أو regex، لأنه سيمتص الإنهاء.
لكن "\ج\X" هو "FILE SEPARATOR" متسلسل مع X للجميع X. الخارجية "\c؟" على
ASCII، الذي ينتج عنصر تحكم غير C0 "DEL"، ينتج عنه عنصر تحكم خارجي "APC" على EBCDIC،
الذي ليس موجودًا في كتلة عناصر التحكم المتجاورة. لاحظ أن دقة هذا هو
أن "\ج؟" على منصات ASCII هو حرف ASCII، في حين أنه لا يعادل أي حرف
حرف ASCII في منصات EBCDIC.
مركز حقوق الإنسان أورد 8859-1 0037 1047 && POSIX-BC
-------------------------------------------------- ---------------------
\ج@0
\ج1
\ ج ب 2
\ ج 3
\ج 4
\ج 5
\ ج 6
\ج 7
\ج 8
\ج 9
\ج 10
\ج11
\ج 12
\ سم 13
\c14
\ج 15
\ج16
\جس17
\ج 18
\cS19
\ج 20
\ج 21 **
\ج22
\ج 23
\ج×24
\ج ص 25
\ج 26
\ج[27
\ج\×28 X X X
ج] 29
\ج^ 30
\ج_ 31
\ج؟ *
"*" ملاحظة: "\c؟" خرائط إلى الترتيبي 127 ("DEL") على منصات ASCII، ولكن بما أن الترتيبي 127 هو
ليس حرف تحكم على أجهزة EBCDIC، "\c؟" بدلاً من ذلك، يتم تعيينها على "APC"، وهي
255 في 0037 و1047، و95 في POSIX-BC.
FUNCTION اختلافات
يجب إعطاء "chr()" "chr()" وسيطة رقم رمز EBCDIC للحصول على الحرف المطلوب
قيمة الإرجاع على منصة EBCDIC. على سبيل المثال:
$CAPITAL_LETTER_A = مركز حقوق الإنسان(193)
أكبر نقطة رمز يمكن تمثيلها في UTF-EBCDIC هي U+7FFF_FFFF. اذا أنت
قم بإجراء "chr()" على قيمة أكبر، وسيحدث خطأ في وقت التشغيل (يشبه القسمة على 0).
يحدث.
"ord()" "ord()" سيُرجع قيم أرقام كود EBCDIC على النظام الأساسي EBCDIC. على سبيل المثال:
$the_number_193 = ord("A");
"علية()"
تعتمد قوالب "c" و"C" لـ "pack()" على ترميز مجموعة الأحرف.
تتضمن أمثلة الاستخدام على EBCDIC ما يلي:
$foo = pack("CCCC",193,194,195,196);
# $foo مكافئ "ABCD"
$foo = pack("C4",193,194,195,196);
# نفس الشيء
$foo = pack("ccxxcc",193,194,195,196);
# $foo مكافئ "AB\0\0CD"
لقد تم نقل القالب "U" ليعني "Unicode" على جميع الأنظمة الأساسية
حزمة ("U"، 65) مكافئ "أ"
صحيح على جميع المنصات. إذا كنت تريد نقاط التعليمات البرمجية الأصلية للـ 256 المنخفض، فاستخدم
قالب "دبليو". وهذا يعني أن المعادلات
pack("W"، ord($character)) مكافئ $character
unpack("W", $character) == ord $character
سوف يعقد.
أكبر نقطة رمز يمكن تمثيلها في UTF-EBCDIC هي U+7FFF_FFFF. اذا أنت
حاول حزم قيمة أكبر في الشخصية، وهو خطأ في وقت التشغيل (على غرار Division
بنسبة 0) سوف يحدث.
"مطبعة()"
يجب على المرء أن يكون حذرا مع الكميات والسلاسل التي يتم تمريرها للطباعة التي تحتوي على
ترميزات ASCII. أحد الأماكن الشائعة لحدوث ذلك هو إخراج MIME
اكتب رأسًا لكتابة البرنامج النصي CGI. على سبيل المثال، العديد من أدلة البرمجة بيرل
أوصي بشيء مشابه لـ:
طباعة "نوع المحتوى:\ttext/html\015\012\015\012";
# قد يكون هذا خطأ في EBCDIC
يمكنك بدلا من ذلك الكتابة
طباعة "نوع المحتوى:\ttext/html\r\n\r\n"; # موافق لـ DGW وآخرون
وجعلها تعمل بشكل محمول.
وذلك لأن الترجمة من EBCDIC إلى ASCII تتم بواسطة خادم الويب في
هذه القضية. راجع وثائق خادم الويب الخاص بك لمزيد من التفاصيل.
"برينتف ()"
التنسيقات التي يمكنها تحويل الأحرف إلى أرقام والعكس ستكون
تختلف عن نظيراتها ASCII عند تنفيذها على منصة EBCDIC.
ومن الأمثلة على ذلك:
printf("%c%c%c",193,194,195); # يطبع ABC
"نوع()"
قد تختلف نتائج فرز EBCDIC عن نتائج فرز ASCII خاصة بالنسبة للحالة المختلطة
سلاسل. سيتم مناقشة هذا بمزيد من التفصيل أدناه.
"سبرينتف ()"
راجع مناقشة "printf ()" أعلاه. مثال على استخدام sprintf سيكون
أن يكون:
$CAPITAL_LETTER_A = sprintf("%c",193);
"أفرغ()"
راجع مناقشة "pack ()" أعلاه.
لاحظ أنه من الممكن كتابة تعليمات برمجية محمولة لهذه الأشياء عن طريق تحديد الأشياء في Unicode
الأرقام واستخدام دالة التحويل:
برينتف("%c",utf8::unicode_to_native(65))؛ # يطبع A على الكل
# منصات
طباعة utf8::native_to_unicode(ord("A")); # وبالمثل، يطبع 65
راجع "Unicode وEBCDIC" في perluniintro و"CONVERSIONS" للحصول على خيارات أخرى.
منتظم التعبير اختلافات
يمكنك كتابة تعبيراتك النمطية تمامًا كما يفعل أي شخص على منصة ASCII.
لكن ضع في اعتبارك أن استخدام التدوين الثماني أو السداسي لتحديد نقطة رمز معينة سيؤدي إلى ذلك
يمنحك الحرف الذي تعينه صفحة الرموز EBCDIC أصلاً. (وهذا صحيح أيضا
لجميع السلاسل ذات علامات الاقتباس المزدوجة.) إذا كنت تريد الكتابة بشكل محمول، فما عليك سوى استخدام "\N{U+...}"
التدوين في كل مكان حيث كنت ستستخدم "\x{...}"، ولا تستخدم التدوين الثماني في
الكل.
بدءًا من الإصدار 5.22 من Perl، ينطبق هذا على النطاقات الموجودة في فئات الأحرف بين قوسين. اذا أنت
قل، على سبيل المثال، "qr/[\N{U+20}-\N{U+7F}]/"، فهذا يعني الأحرف "\N{U+20}"،
"\N{U+21}"، ...، "\N{U+7F}". هذا النطاق هو كافة الأحرف القابلة للطباعة التي يحتوي عليها ملف ASCII
تحتوي مجموعة الأحرف.
قبل الإصدار v5.22، لم يكن بإمكانك تحديد أي نطاقات قابلة للنقل، باستثناء (بدءًا من Perl v5.5.3)
تم ترميز جميع المجموعات الفرعية للنطاقات "[AZ]" و"[az]" خصيصًا لعدم التقاط الفجوة
الشخصيات. على سبيل المثال، الأحرف مثل "o" ("o With CIRCUMFLEX") التي تقع بينهما
لن تتم مطابقة "I" و"J" مع نطاق التعبير العادي "/[HK]/". ولكن إذا كان أي منهما
نقاط نهاية النطاق رقمية بشكل صريح (ولم يتم تحديد أي منها بواسطة "\N{U+...}")،
تتم مطابقة أحرف الفجوة:
/[\x89-\x91]/
سوف يتطابق مع "\x8e"، على الرغم من أن "\x89" هو "i" و"\x91 " هو "j"، و"\x8e" عبارة عن فجوة
الحرف، من وجهة النظر الأبجدية.
هناك بنية أخرى يجب الحذر منها وهي الاستخدام غير المناسب للست عشري (إلا إذا كنت تستخدم
"\N{U+...}") أو الثوابت الثمانية في التعبيرات العادية. النظر في المجموعة التالية من
الغواصات:
الفرعي هو_c0 {
$char = substr(shift,0,1);
$char =~ /[\000-\037]/;
}
الفرعي is_print_ascii {
$char = substr(shift,0,1);
$char =~ /[\040-\176]/;
}
الفرعي هو_حذف {
$char = substr(shift,0,1);
$شار مكافئ "\177";
}
الفرعي هو_c1 {
$char = substr(shift,0,1);
$char =~ /[\200-\237]/;
}
sub is_latin_1 { # ولكن ليس ASCII؛ ليس C1
$char = substr(shift,0,1);
$char =~ /[\240-\377]/;
}
هذه صالحة فقط على منصات ASCII. بدءًا من الإصدار 5.22 من Perl، ما عليك سوى تغيير ملف
الثوابت الثمانية إلى قيم "\N{U+...}" المكافئة تجعلها محمولة:
الفرعي هو_c0 {
$char = substr(shift,0,1);
$char =~ /[\N{U+00}-\N{U+1F}]/;
}
الفرعي is_print_ascii {
$char = substr(shift,0,1);
$char =~ /[\N{U+20}-\N{U+7E}]/;
}
الفرعي هو_حذف {
$char = substr(shift,0,1);
$char مكافئ "\N{U+7F}";
}
الفرعي هو_c1 {
$char = substr(shift,0,1);
$char =~ /[\N{U+80}-\N{U+9F}]/;
}
sub is_latin_1 { # ولكن ليس ASCII؛ ليس C1
$char = substr(shift,0,1);
$char =~ /[\N{U+A0}-\N{U+FF}]/;
}
وإليك بعض الطرق المحمولة البديلة لكتابتها:
الفرعي Is_c0 {
$char = substr(shift,0,1);
إرجاع $char =~ /[[:cntrl:]]/a && ! Is_delete($char);
# بدلاً عن ذلك:
# إرجاع $char =~ /[[:cntrl:]]/
# && $char =~ /[[:ascii:]]/
# && ! Is_delete($char);
}
الفرعي Is_print_ascii {
$char = substr(shift,0,1);
إرجاع $char =~ /[[:print:]]/a;
# بدلاً عن ذلك:
# return $char =~ /[[:print:]]/ && $char =~ /[[:ascii:]]/;
# أو
# إرجاع شار $
# =~ /[ !"\#\$%&'()*+,\-.\/0-9:;<=>?\@AZ[\\\]^_`az{|}~] /;
}
الفرعي Is_delete {
$char = substr(shift,0,1);
إرجاع utf8::native_to_unicode(ord $char) == 0x7F;
}
الفرعي Is_c1 {
استخدم الميزة "unicode_strings"؛
$char = substr(shift,0,1);
return $char =~ /[[:cntrl:]]/ && $char !~ /[[:ascii:]]/;
}
sub Is_latin_1 { # ولكن ليس ASCII؛ ليس C1
استخدم الميزة "unicode_strings"؛
$char = substr(shift,0,1);
ترتيب الإرجاع($char) <256
&& $char !~ /[[:ascii:]]/
&& $char !~ /[[:cntrl:]]/;
}
هناك طريقة أخرى لكتابة "Is_latin_1()" وهي استخدام الأحرف الموجودة في النطاق
صراحة:
الفرعية Is_latin_1 {
$char = substr(shift,0,1);
$char =~ /[ XXXXXXXXXXXXXXXXXXXXXXXXXXXAAAA~AeAaAECEEEEeIIIIe]
[-N~OOOO~OeXOUUUUeYPssaaaa~aeaaaeceeeeeiiii`n~oooo~oeXouuuueypye]/x;
}
على الرغم من أن هذا النموذج قد يواجه مشكلة في النقل عبر الشبكة (بسبب وجود 8 بت
الأحرف) أو على مجموعات أحرف غير ISO-Latin. لكنه يسمح بإعادة كتابة "Is_c1".
لذا فهو يعمل على لغة Perls التي لا تحتوي على "unicode_strings" (أقدم من الإصدار 5.14):
sub Is_latin_1 { # ولكن ليس ASCII؛ ليس C1
$char = substr(shift,0,1);
ترتيب الإرجاع($char) <256
&& $char !~ /[[:ascii:]]/
&& ! Is_latin1($char);
}
مآخذ
تفترض معظم برمجة المقبس ترميزات أحرف ASCII بترتيب بايت الشبكة.
يمكن أن تتضمن الاستثناءات كتابة البرنامج النصي CGI ضمن خادم ويب مضيف حيث يمكن للخادم ذلك
رعاية الترجمة بالنسبة لك. تقوم معظم خوادم الويب المضيفة بتحويل بيانات EBCDIC إلى ISO-8859-1
أو Unicode عند الإخراج.
فرز
أحد الاختلافات الكبيرة بين مجموعات الأحرف المستندة إلى ASCII ومجموعات الأحرف EBCDIC هو الفارق النسبي
مواضع الأحرف عند فرزها بالترتيب الأصلي. الأكثر إثارة للقلق هي العليا
والأحرف الصغيرة والأرقام والشرطة السفلية ("_"). على منصات ASCII
ترتيب الفرز الأصلي يحتوي على أرقام تأتي قبل الأحرف الكبيرة التي تأتي قبل
الشرطة السفلية التي تأتي قبل الحروف الصغيرة. على EBCDIC، تأتي الشرطة السفلية
أولاً، ثم الأحرف الصغيرة، ثم الأحرف الكبيرة، وأخيراً الأرقام. لو
تم فرزه على منصة تعتمد على ASCII، ويأتي الاختصار المكون من حرفين للطبيب
قبل اختصار محرك الأقراص المكون من حرفين؛ إنه:
@sorted =sort(qw(Dr.dr.)); # @sorted يحمل ('Dr.'،'dr.') على ASCII،
# لكن ('dr.'،'Dr.') على EBCDIC
يتم نقل خاصية الأحرف الصغيرة قبل الأحرف الكبيرة في EBCDIC إلى اللاتينية
1 صفحات EBCDIC مثل 0037 و1047. ومن الأمثلة على ذلك "Ee" ("E With DIAERESIS"،
203) يأتي قبل "ee" ("e With DIAERESIS"، 235) على منصة ASCII، ولكن الأخير (83)
يأتي قبل السابق (115) على منصة EBCDIC. (سوف يلاحظ القراء الأذكياء أن
النسخة الكبيرة من "ss" "SMALL LETTER SHARP S" هي ببساطة "SS" وهذا الحرف الكبير
إصدارات "ye" (صغيرة "y With DIAERESIS") و"X" ("MICRO SIGN") ليست في 0..255
نطاق ولكن في Unicode، في Unicode تمكين Perl).
سيؤدي ترتيب الفرز إلى حدوث اختلافات بين النتائج التي تم الحصول عليها على منصات ASCII مقابل النتائج التي تم الحصول عليها
منصات EBCDIC. فيما يلي بعض الاقتراحات حول كيفية التعامل معها
اختلافات.
تجاهل ASCII مقابل EBCDIC sort اختلافات.
هذه هي الإستراتيجية الأقل تكلفة من الناحية الحسابية. قد يتطلب الأمر بعض تعليم المستخدم.
استعمل a sort المساعد وظيفة
هذه استراتيجية عامة تمامًا، ولكنها الأكثر تكلفة من الناحية الحسابية. اختر واحدة
أو مجموعة الأحرف الأخرى والتحويل إليها لكل مقارنة نوع. وهنا أ
مثال كامل يتحول إلى ترتيب الفرز ASCII:
sub original_to_uni($) {
سلسلة $ الخاصة بي = Shift;
# يوفر الوقت على منصة ASCII
قم بإرجاع سلسلة $ إذا كان الأمر 'A' == 65؛
الناتج $ الخاص بي = "";
لـ $i (0 .. length($string) - 1) {
الإخراج دولار
.= chr(utf8::native_to_unicode(ord(substr($string, $i, 1))));
}
# الحفاظ على utf8ness للإدخال في الإخراج، حتى لو لم يكن هناك حاجة إليه
# أن يكون utf8
utf8::upgrade($output) إذا utf8::is_utf8($string);
إرجاع الناتج $؛
}
sub ascii_order { # مساعد الفرز
إرجاع original_to_uni($a) cmp original_to_uni($b);
}
فرز ascii_order @list؛
MONO هيكل الساعة: then sort البيانات (لل غير أرقام، بدون الشرطة السفلية)
إذا كنت لا تهتم بمكان فرز الأرقام والشرطة السفلية، فيمكنك القيام بشيء مثل
sub case_insensitive_order { # مساعد الفرز
إرجاع lc($a) cmp lc($b)
}
فرز case_insensitive_order @list؛
إذا كان الأداء يمثل مشكلة، ولا تهتم إذا كان الإخراج في نفس الحالة مثل ملف
الإدخال، استخدم "tr///" للتحويل إلى الحالة الأكثر استخدامًا في البيانات. إذا كانت البيانات
هي في المقام الأول الأحرف الكبيرة غير اللاتينية 1، ثم قم بتطبيق "tr/[az]/[AZ]/"، ثم "sort()". لو
البيانات في المقام الأول هي أحرف صغيرة غير لاتينية 1 ثم قم بتطبيق "tr/[AZ]/[az]/" قبل الفرز.
إذا كانت البيانات في المقام الأول بأحرف كبيرة وتتضمن أحرفًا لاتينية-1، فقم بتطبيق ما يلي:
tr/[az]/[AZ]/;
tr/[aaaa~aeaaaeceeeeeiiiiie`n~oooo~oeouuuueyp]/[AAAA~AeAaAECEEEEeIIIIe‐N~OOOO~OeOUUUUeYP/;
ق/سس/سس/ز؛
ثم "الفرز ()". إذا كان لديك خيار، فمن الأفضل أن تكتب الأشياء بأحرف صغيرة لتجنب ذلك
مشاكل الحرفين اللاتينيين 1 الذين تكون أحرفهم الكبيرة خارج اللاتينية 1: "ye" (صغير "y
مع DIAAERESIS") و"X" ("MICRO SIGN"). إذا كنت بحاجة إلى كتابة أحرف كبيرة، فيمكنك ذلك؛ باستخدام
بيرل مع تمكين Unicode، قم بما يلي:
tr/ye/\x{178}/;
tr/X/\x{39C}/;
نفذ فرز on صورة واحدة؟ نوع of المنصة فقط.
يمكن لهذه الإستراتيجية استخدام اتصال الشبكة. على هذا النحو سيكون حسابيا
مكلفة.
TRANSFORMATION صيغ
هناك مجموعة متنوعة من الطرق لتحويل البيانات من خلال تعيين مجموعة أحرف داخلية
تخدم مجموعة متنوعة من الأغراض. تمت مناقشة الفرز في القسم السابق وعدد قليل من
ستتم مناقشة تقنيات رسم الخرائط الأخرى الأكثر شيوعًا بعد ذلك.
URL فك و ترميز
لاحظ أن بعض عناوين URL تحتوي على نقاط كود ASCII السداسية العشرية في محاولة للتغلب عليها
مشكلات تتعلق بتقييد الأحرف أو البروتوكول. على سبيل المثال، حرف التلدة ليس موجودًا في كل مكان
لوحة المفاتيح ومن ثم عنوان URL للنموذج:
http://www.pvhp.com/~pvhp/
يمكن أيضًا التعبير عنها بأي من:
http://www.pvhp.com/%7Epvhp/
http://www.pvhp.com/%7epvhp/
حيث 7E هي نقطة رمز ASCII السداسية العشرية لـ "~". هنا مثال على فك هذا
عنوان URL في أي صفحة رموز EBCDIC:
$ url = 'http://www.pvhp.com/%7Epvhp/';
$url =~ s/%([0-9a-fA-F]{2})/
pack("c",utf8::unicode_to_native(hex($1)))/xge;
على العكس من ذلك، إليك حل جزئي لمهمة تشفير عنوان URL هذا في أي EBCDIC
صفحة التعليمات البرمجية:
$ url = 'http://www.pvhp.com/~pvhp/';
# التعبير العادي التالي لا يعالج
# تعيينات لـ: ('.' => '%2E', '/' => '%2F', ':' => '%3A')
$url =~ s/([\t "#%&\(\),;<=>\?\@\[\\\]^`{|}~])/
sprintf("%%%02X",utf8::native_to_unicode(ord($1)))/xge;
حيث يؤدي الحل الأكثر اكتمالاً إلى تقسيم عنوان URL إلى مكونات وتطبيق s/// كاملاً
الاستبدال فقط بالأجزاء المناسبة.
uu ترميز و فك
سيعرض القالب "u" إلى "pack()" أو "unpack()" بيانات EBCDIC بأحرف EBCDIC
يعادل نظيراتها ASCII. على سبيل المثال، سيتم طباعة ما يلي "نعم
بالفعل\n" على كمبيوتر ASCII أو EBCDIC:
$all_byte_chrs = '';
for (0..255) { $all_byte_chrs .= chr($_); }
$uuencode_byte_chrs = pack('u', $all_byte_chrs);
($uu = <<'ENDOFHEREDOC') =~ s/^\s*//gm;
M``$"`P0%!@<("0H+#`T.#Q`1$A,4%187&!D:&QP='A\@(2(C)"4F)R@I*BLL
M+2XO,#$R,S0U-C<X.3H[/#T^/T!!0D-$149'2$E*2TQ-3D]045)35%565UA9
M6EM<75Y?8&%B8V1E9F=H:6IK;&UN;W!Q<G-T=79W>'EZ>WQ]?G^`@8*#A(6&
MAXB)BHN,C8Z/D)&2DY25EI>8F9J;G)V>GZ"AHJ.DI::GJ*FJJZRMKJ^PL;*S
MM+6VM[BYNKN\O;Z_P,'"P\3%QL?(R<K+S,W.S]#1TM/4U=;7V-G:V]S=WM_@
?X>+CY.7FY^CIZNOL[>[O\/'R\_3U]O?X^?K[_/W^_P``
إندوفيردوك
إذا ($uuencode_byte_chrs مكافئ $uu) {
طباعة "نعم"؛
}
$uudecode_byte_chrs = unpack('u', $uuencode_byte_chrs);
إذا ($uudecode_byte_chrs مكافئ $all_byte_chrs) {
طباعة "في الواقع\n";
}
إليك برنامج uudecoder بسيط جدًا سيعمل على EBCDIC:
#! / usr / local / bin / perl
$_ = <> حتى ($mode,$file) = /^begin\s*(\d*)\s*(\S*)/;
open(OUT, "> $file") إذا كان $file ne "";
بينما(<>) {
الأخير إذا /^end/;
التالي إذا /[az]/;
التالي ما لم int(((utf8::native_to_unicode(ord()) - 32 ) & 077)
+ 2) / 3)
== int(length() / 4);
طباعة OUT فك("u", $_);
}
اغلق)؛
chmod oct($mode), $file;
ونقلت للطباعة ترميز و فك
في الأنظمة الأساسية المشفرة بـ ASCII، من الممكن إزالة الأحرف خارج المجموعة القابلة للطباعة
باستخدام:
# يعمل برنامج التشفير QP هذا على ASCII فقط
$qp_string =~ s/([=\x00-\x1F\x80-\xFF])/
sprintf("=%02X",ord($1))/xge;
بدءًا من الإصدار Perl v5.22، يعد هذا قابلاً للتغيير بشكل بسيط للعمل بشكل محمول على كل من ASCII و
منصات EBCDIC.
# يعمل برنامج التشفير QP هذا على كل من ASCII وEBCDIC
$qp_string =~ s/([=\N{U+00}-\N{U+1F}\N{U+80}-\N{U+FF}])/
sprintf("=%02X",ord($1))/xge;
بالنسبة لأنظمة Perls الأقدم، سيبدو برنامج تشفير QP الذي يعمل على كل من منصات ASCII وEBCDIC
إلى حد ما مثل ما يلي:
$delete = utf8::unicode_to_native(ord("\x7F"));
$qp_string =~
ق/([^[:طباعة:]$حذف])/
sprintf("=%02X",utf8::native_to_unicode(ord($1)))/xage;
(على الرغم من أنه في كود الإنتاج قد يتم إجراء البدائل في فرع EBCDIC باستخدام الامتداد
استدعاء الوظيفة وبشكل منفصل في فرع ASCII دون حساب خريطة الهوية؛
في Perl v5.22، تم تحسين خريطة الهوية بحيث لا تكون هناك أي نفقات، ولكن
البديل أعلاه أبسط وهو متوفر أيضًا في الإصدار 5.22).
يمكن فك تشفير سلاسل QP هذه باستخدام:
# وحدة فك ترميز QP هذه تقتصر على ASCII فقط
$string =~ s/=([[:xdigit:][[:xdigit:])/chr hex $1/ge;
$string =~ s/=[\n\r]+$//;
في حين أن وحدة فك ترميز QP التي تعمل على منصات ASCII وEBCDIC قد تبدو إلى حد ما
مثل ما يلي:
$string =~ s/=([[:xdigit:][:xdigit:]])/
chr utf8::native_to_unicode(hex $1)/xge;
$string =~ s/=[\n\r]+$//;
عملية قيصرية الأصفار
يعود تاريخ ممارسة تبديل حرف أبجدي واحد أو أكثر للتشفير
آلاف السنين وقد تم تفصيلها بوضوح من قبل جايوس يوليوس قيصر في كتابه غالي الحروب
نص. يُشار أحيانًا إلى التحول الأبجدي الفردي بالتناوب ومقدار التحول
يتم تقديمه كرقم $n بعد السلسلة "rot" أو "rot$n". سيتم تعيين Rot0 وrot26
خرائط الهوية على النسخة الإنجليزية المكونة من 26 حرفًا للأبجدية اللاتينية. Rot13 لديه
الخاصية المثيرة للاهتمام التي تتناوب مع الاستدعاءات اللاحقة هي خرائط الهوية (وبالتالي rot13
هو معكوسه غير التافه في مجموعة مكونة من 26 دورة أبجدية). ومن هنا
فيما يلي برنامج التشفير ووحدة فك التشفير rot13 الذي سيعمل على منصات ASCII وEBCDIC:
#! / usr / local / bin / perl
بينما (<>) {
tr/n-za-mN-ZA-M/a-zA-Z/;
طباعة.
}
على شكل سطر واحد:
بيرل -ne 'tr/n-za-mN-ZA-M/a-zA-Z/;print'
تجزئة طلب و اختبارية
يقوم Perl بتوزيع ترتيب التجزئة بشكل عشوائي لأغراض أمنية على كل من ASCII وEBCDIC
المنصات.
ستختلف المجاميع الاختبارية EBCDIC لنفس الملف المترجم إلى ASCII والعكس صحيح.
I18N لأي لبس L10N
يتم دعم التدويل (I18N) والتعريب (L10N) من حيث المبدأ على الأقل
حتى على منصات EBCDIC. تعتمد التفاصيل على النظام وتتم مناقشتها ضمن "نظام التشغيل
قسم "القضايا" أدناه.
متعدد الثماني حرف الاطقم
تعمل لغة Perl مع UTF-EBCDIC، وهو ترميز متعدد البايت. في لغة Perls الأقدم من الإصدار 5.22، قد يكون هناك
تكون الأخطاء المختلفة في هذا الصدد.
صفحات رموز EBCDIC القديمة متعددة البايت XXX.
OS قضايا
قد تكون هناك بعض المشكلات التي تعتمد على النظام والتي تهم مبرمجي EBCDIC Perl.
OS / 400
PASE بيئة PASE هي بيئة تشغيل لنظام التشغيل OS/400 يمكنها تشغيل الملفات التنفيذية
مصمم لـ PowerPC AIX في OS/400؛ انظر بيرلوس400. يعتمد PASE على ASCII، وليس EBCDIC-
على أساس ILE.
الوصول إلى IFS
XXX.
OS / 390، ض / OS
يعمل Perl ضمن Unix Systems Services أو USS.
"سيجاكشن"
يمكن أن يكون لـ "SA_SIGINFO" أخطاء في التجزئة.
"سي إتش سي بي" chcp يتم دعمه كأداة مساعدة لعرض وتغيير صفحة الرموز الخاصة به.
انظر أيضا chcp(1).
الوصول إلى مجموعة البيانات
للوصول إلى مجموعة البيانات التسلسلية حاول:
my @ds_records = `cat //DSNAME`;
أو:
my @ds_records = `cat //'HLQ.DSNAME'`;
راجع أيضًا وحدة OS390::Stdio على CPAN.
"أيقونف" iconv يتم دعمه كأداة مساعدة Shell وروتين C RTL. أنظر أيضاً
iconv(1) و iconv(3) صفحات كتيب.
يتم دعم اللغات. قد تكون هناك بعض الأخطاء عندما تكون اللغة هي رمز EBCDIC آخر
الصفحة التي تحتوي على بعض الأحرف المتغيرة لصفحة التعليمات البرمجية في مواضع أخرى.
لا توجد حاليًا أي لغات UTF-8 حقيقية، على الرغم من وجود بعض أسماء اللغات
تحتوي على السلسلة "UTF-8".
راجع perllocale للحصول على معلومات حول اللغات. ملفات L10N موجودة /usr/nls/locale.
$Config{d_setlocale} هو "تعريف" على OS/390 أو z/OS.
بوسيكس-BC؟
XXX.
استخدم perlebcdic عبر الإنترنت باستخدام خدمات onworks.net