ستوضح المقالة التالية المشكلات المذكورة أعلاه وتناقشها، وسنأخذ كلمة "الصينية" كمثال، ويظهر البحث في المعلومات ذات الصلة أن ترميز GB2312 لـ "الصينية" هو "d6d0 cec4" وترميز Unicode هو "4e2d 6587". ترميز UTF هو "e4b8ad e69687". (لاحظ أن الكلمتين "الصينية" لا تحتويان على ترميز iso8859-1، ولكن يمكن "تمثيلهما" بتشفير iso8859-1).
1. المعرفة الأساسية بالبرمجة:
الترميز الأول هو iso8859-1، وهو مشابه لتشفير ascii. ومع ذلك، من أجل تسهيل تمثيل اللغات المختلفة، ظهرت تدريجياً العديد من الترميزات القياسية، أهمها ما يلي:
1. ايزو8859-1
إنه ترميز أحادي البايت، والحد الأقصى لنطاق الأحرف الذي يمكن تمثيله هو 0-255 ويتم تطبيقه على السلسلة الإنجليزية. على سبيل المثال، ترميز الحرف a هو 0x61=97.
من الواضح أن نطاق الأحرف الذي يمثله ترميز ISO8859-1 ضيق جدًا ولا يمكن أن يمثل الأحرف الصينية. ومع ذلك، نظرًا لأنه ترميز أحادي البايت ويتوافق مع وحدة التمثيل الأساسية للكمبيوتر، فإن ترميز iso8859-1 لا يزال مستخدمًا في كثير من الحالات. وفي العديد من البروتوكولات، يتم استخدام هذا التشفير افتراضيًا. على سبيل المثال، على الرغم من أن الكلمة "الصينية" غير موجودة في ترميز iso8859-1، مع أخذ ترميز gb2312 كمثال، يجب أن تتكون من حرفين من "d6d0 cec4". عند استخدام ترميز iso8859-1، سيتم تقسيمها إلى 4 بايت يمثل: "d6 d0 ce c4" (في الواقع، عند التخزين، تتم معالجته أيضًا بالبايت). وإذا كان بتشفير UTF، فهو 6 بايت "e4 b8 ad e6 96 87". من الواضح أن هذا التمثيل يجب أن يعتمد على ترميز آخر.
2.GB2312/GBK
هذا هو الكود القياسي الوطني لهانزي، والذي يستخدم خصيصًا لتمثيل الأحرف الصينية، وهو ترميز مزدوج البايت، وتتوافق الحروف الإنجليزية مع ISO8859-1 (متوافق مع ترميز ISO8859-1). من بينها، يمكن استخدام ترميز gbk لتمثيل الأحرف الصينية التقليدية والمبسطة في نفس الوقت، بينما يمكن أن يمثل gb2312 أحرفًا مبسطة فقط. يتوافق gbk مع ترميز gb2312.
3.يونيكود
هذا هو التشفير الأكثر توحيدًا الذي يمكن استخدامه لتمثيل الأحرف بجميع اللغات، وهو عبارة عن تشفير مزدوج البايت ثابت الطول (أيضًا أربعة بايت)، بما في ذلك الحروف الإنجليزية. لذلك يمكن القول أنه غير متوافق مع ترميز ISO8859-1، كما أنه غير متوافق مع أي ترميز. ومع ذلك، بالمقارنة مع ترميز ISO8859-1، يضيف ترميز Uniocode فقط 0 بايت في المقدمة، على سبيل المثال، الحرف a هو "00 61".
تجدر الإشارة إلى أن التشفير ذو الطول الثابت يسهل على أجهزة الكمبيوتر معالجته (لاحظ أن GB2312/GBK ليس ترميزًا ذو طول ثابت)، ويمكن استخدام unicode لتمثيل جميع الأحرف، لذلك يتم استخدام تشفير unicode داخليًا في العديد من البرامج. مثل جافا.
4.UTF
مع الأخذ في الاعتبار أن ترميز unicode غير متوافق مع ترميز iso8859-1، ويشغل مساحة أكبر بسهولة: لأنه بالنسبة للأحرف الإنجليزية، يتطلب unicode أيضًا وحدتي بايت لتمثيله. لذا فإن Unicode ليس مناسبًا للنقل والتخزين. لذلك تم إنتاج ترميز UTF، وهو ترميز UTF متوافق مع ترميز ISO8859-1 ويمكن استخدامه أيضًا لتمثيل الأحرف بجميع اللغات، إلا أن ترميز UTF هو ترميز متغير الطول، ويتراوح طول كل حرف من 1 إلى 6 بايت. بالإضافة إلى ذلك، يأتي تشفير UTF مزودًا بوظيفة تحقق بسيطة. بشكل عام، يتم تمثيل الحروف الإنجليزية ببايت واحد، بينما تستخدم الأحرف الصينية ثلاث بايت.
لاحظ أنه على الرغم من استخدام UTF لاستخدام مساحة أقل، إلا أنه يتم مقارنته بتشفير Unicode فقط. إذا كنت تعرف بالفعل أنه عبارة عن أحرف صينية، فإن استخدام GB2312/GBK هو بلا شك الأكثر اقتصادًا. ولكن من ناحية أخرى، تجدر الإشارة إلى أنه على الرغم من أن ترميز UTF يستخدم 3 بايت للأحرف الصينية، حتى بالنسبة لصفحات الويب ذات الأحرف الصينية، فإن ترميز UTF سيوفر أكثر من ترميز Unicode، لأن صفحة الويب تحتوي على الكثير من الأحرف الإنجليزية.
2. معالجة جافا للأحرف
عند كتابة تطبيقات Java، سيكون هناك العديد من الأماكن التي تتضمن ترميز مجموعة الأحرف، حيث تتطلب بعض الأماكن إعدادات صحيحة، وتتطلب بعض الأماكن درجة معينة من المعالجة.
1.getBytes(مجموعة الأحرف)
هذه وظيفة قياسية لمعالجة سلسلة Java. وتتمثل وظيفتها في تشفير الأحرف التي تمثلها السلسلة وفقًا لمجموعة الأحرف وتمثيلها بالبايت. لاحظ أنه يتم تخزين السلاسل دائمًا في ذاكرة Java بتشفير Unicode. على سبيل المثال، يتم تخزين "الصينية" كـ "4e2d 6587" في الظروف العادية (أي عند عدم وجود خطأ). إذا كانت مجموعة الأحرف هي "gbk"، فسيتم ترميزها كـ "d6d0 cec4"، ثم البايتات "d6". يتم إرجاع d0 ce c4". إذا كانت مجموعة الأحرف هي "utf8"، فإن النهاية هي "e4 b8 ad e6 96 87". إذا كان "iso8859-1"، لأنه لا يمكن تشفيره، فسيتم إرجاع "3f 3f" أخيرًا (ملاحظة: "3f 3f" عبارة عن علامتي استفهام).
2. سلسلة جديدة (مجموعة الأحرف)
هذه وظيفة قياسية أخرى لمعالجة سلسلة Java، وهي عكس الوظيفة السابقة، فهي تجمع وتحدد مصفوفة البايت وفقًا لترميز مجموعة الأحرف، ثم تقوم بتحويلها في النهاية إلى Unicode للتخزين. بالرجوع إلى مثال getBytes أعلاه، يمكن لكل من "gbk" و"utf8" إنتاج النتيجة الصحيحة "4e2d 6587"، لكن iso8859-1 يصبح أخيرًا "003f 003f" (علامتي استفهام).
نظرًا لأنه يمكن استخدام utf8 لتمثيل/تشفير جميع الأحرف، فإن السلسلة الجديدة( str.getBytes( "utf8" ), "utf8" ) === str، وهي قابلة للعكس تمامًا.
3.setCharacterEncoding()
تُستخدم هذه الوظيفة لتعيين طلبات http أو الترميز المقابل.
بالنسبة للطلب، يشير إلى ترميز المحتوى المقدم. بعد التحديد، يمكنك الحصول مباشرة على السلسلة الصحيحة من خلال getParameter(). إذا لم يتم تحديده، فسيتم استخدام ترميز iso8859-1 بشكل افتراضي، الأمر الذي يتطلب مزيدًا من المعالجة. راجع "إدخال النموذج" أدناه. تجدر الإشارة إلى أنه لا يمكن تنفيذ getParameter() قبل تنفيذ setCharacterEncoding(). ينص مستند Java على ما يلي: يجب استدعاء هذه الطريقة قبل قراءة معلمات الطلب أو قراءة الإدخال باستخدام getReader().