اليوم، استخدمت برنامج جافا سكريبت لإنشاء أداة قائمة في صفحة ASP.NET، وحفظتها باسم MenuScript.js Use <script language="javascript" src="../js/MenuScript.js"></script. في الصفحة >اتصال، وحدثت ظاهرة غريبة أثناء التشغيل: تم عرض الأحرف الصينية في الصفحة بشكل طبيعي، ولكن تم عرض الأحرف الصينية في القائمة كأحرف مشوهة.
لا داعي للسؤال، إذا فكرت في الأمر على ركبتيك، فهناك خطأ ما في الترميز. قم بالتبديل بين ترميز UTF-8 وGB2312 في خيار "عرض" - "التشفير" في الصفحة تصبح الأحرف الموجودة على الصفحة والأحرف الصينية الموجودة في القائمة مشوهة بالتناوب.
الحل: توجد إعدادات ترميز في ملف التكوين: <globalization requestEncoding="utf-8" ResponseEncoding="utf-8" />
يوجد خيار تشفير عند حفظ ملف MenuScript.js (يمكنك فتح هذا الملف باستخدام Word وحفظه كملف آخر، واختيار الترميز)، فقط احتفظ بالترميزين كما هو.
من أجل فهم مشكلة الترميز بشكل أفضل، وجدت مقالًا عن هذا في CSDN، المؤلف: fmddlmyy. أعيد طباعته هنا للرجوع إليه:
دعونا نتحدث عن البرمجة دعونا نتحدث عن البرمجة #المنطقة دعونا نتحدث عن البرمجة
/**//*
0. إنديان كبير و إنديان صغير
إن endian الكبير وendian الصغير هما طريقتان مختلفتان لمعالجة وحدة المعالجة المركزية للأرقام متعددة البايت. على سبيل المثال، ترميز Unicode للحرف "汉" هو 6C49. لذا، عند الكتابة إلى ملف، هل يجب كتابة 6C في المقدمة أم كتابة 49 في المقدمة؟ إذا كان 6C مكتوبًا في المقدمة، فهو نهاية كبيرة. أو اكتب 49 في المقدمة، وهو رقم إندياني صغير.
كلمة "endian" تأتي من "رحلات جاليفر". نشأت الحرب الأهلية في ليليبوت بسبب كسر البيض من الطرف الكبير (إنديان الكبير) أو الطرف الصغير (إنديان الصغير)، ونتيجة لذلك، حدثت ستة حركات تمرد، وفقد أحد الأباطرة حياته، وتسبب ذلك في مقتل أحد الأباطرة والآخر فقد عرشه.
نترجم بشكل عام endian إلى "ترتيب البايت"، ويُطلق على endian الكبير و endian الصغير اسم "النهاية الكبيرة" و"النهاية الصغيرة".
1. ترميز الأحرف والرمز الداخلي بالمناسبة، يجب ترميز أحرف ترميز الأحرف الصينية قبل أن تتم معالجتها بواسطة الكمبيوتر. طريقة التشفير الافتراضية التي يستخدمها الكمبيوتر هي الكود الداخلي للكمبيوتر. استخدمت أجهزة الكمبيوتر المبكرة ترميز ASCII 7 بت من أجل معالجة الأحرف الصينية، صمم المبرمجون GB2312 للغة الصينية المبسطة وbig5 للصينية التقليدية.
يحتوي GB2312 (1980) على إجمالي 7445 حرفًا، بما في ذلك 6763 حرفًا صينيًا و682 رمزًا آخر. نطاق الكود الداخلي لمنطقة الأحرف الصينية هو من B0-F7 في البايت العالي، A1-FE في البايت المنخفض، وبتات الكود المشغولة هي 72*94=6768. من بينها 5 وظائف شاغرة هي D7FA-D7FE.
يدعم GB2312 عددًا قليلاً جدًا من الأحرف الصينية. تتضمن مواصفات توسيع الأحرف الصينية لعام 1995 GBK1.0 21886 رمزًا، مقسمة إلى منطقة الأحرف الصينية ومنطقة الرمز الرسومي. تتضمن منطقة الأحرف الصينية 21003 حرفًا. GB18030 في عام 2000 هو المعيار الوطني الرسمي الذي حل محل GBK1.0. يتضمن هذا المعيار 27484 حرفًا صينيًا، بالإضافة إلى اللغات التبتية والمنغولية والأويغورية وغيرها من لغات الأقليات العرقية الرئيسية. يجب أن يدعم نظام الكمبيوتر الشخصي الحالي GB18030، ولا توجد متطلبات للمنتجات المضمنة. لذلك، تدعم الهواتف المحمولة وMP3 بشكل عام فقط GB2312.
من ASCII، GB2312، GBK إلى GB18030، تكون طرق التشفير هذه متوافقة مع الإصدارات السابقة، أي أن نفس الحرف دائمًا ما يكون له نفس التشفير في هذه المخططات، وتدعم المعايير الأحدث المزيد من الأحرف. في هذه الترميزات، يمكن معالجة اللغتين الإنجليزية والصينية بشكل موحد. طريقة التمييز بين الترميز الصيني هي أن أعلى بت من البايت العالي ليس 0. وفقًا لما يسميه المبرمجون، فإن GB2312 وGBK إلى GB18030 جميعها تنتمي إلى مجموعات الأحرف مزدوجة البايت (DBCS).
لا يزال الرمز الداخلي الافتراضي لبعض أنظمة Windows الصينية هو GBK، والذي يمكن ترقيته إلى GB18030 من خلال حزمة ترقية GB18030. ومع ذلك، فإن الأحرف التي أضافها GB18030 مقارنة بـ GBK يصعب على الأشخاص العاديين استخدامها عادةً، ما زلنا نستخدم GBK للإشارة إلى التعليمات البرمجية الداخلية لنظام Windows.
فيما يلي بعض التفاصيل الإضافية:
لا يزال النص الأصلي لـ GB2312 هو رمز المنطقة، من رمز المنطقة إلى الرمز الداخلي، يجب إضافة A0 إلى البايت العالي والبايت المنخفض على التوالي.
في DBCS، يكون تنسيق تخزين التعليمات البرمجية الداخلية للجيجابايت دائمًا هو النهاية الكبيرة، أي أن البت عالي الترتيب يأتي أولاً.
أعلى بتات من البايتين GB2312 كلاهما 1. ولكن لا يوجد سوى 128*128=16384 نقطة كود تستوفي هذا الشرط. ولذلك، فإن أعلى بت من البايت المنخفض لـ GBK وGB18030 قد لا يكون 1. ومع ذلك، لا يؤثر هذا على تحليل دفق أحرف DBCS: عند قراءة دفق أحرف DBCS، طالما تمت مواجهة بايت ذات بتة عالية تبلغ 1، يمكن ترميز البايتين التاليتين كبايت مزدوج، بغض النظر عن بايت منخفض ما هو الموقف العالي.
2. يونيكود، UCS وUTF
كما ذكرنا سابقًا، فإن طرق التشفير من ASCII، GB2312، GBK إلى GB18030 متوافقة مع الإصدارات السابقة. Unicode متوافق فقط مع ASCII (بشكل أكثر دقة، متوافق مع ISO-8859-1) وغير متوافق مع رمز GB. على سبيل المثال، ترميز Unicode للحرف "汉" هو 6C49، بينما رمز GB هو BABA.
تعد Unicode أيضًا طريقة لترميز الأحرف، ولكنها مصممة من قبل منظمة دولية ويمكنها استيعاب أنظمة التشفير لجميع اللغات حول العالم. الاسم العلمي لـ Unicode هو "مجموعة الأحرف المشفرة العالمية ذات الثماني بتات"، أو اختصارًا UCS. يمكن اعتبار UCS اختصارًا لـ "Unicode Character Set".
وفقًا لويكيبيديا ( http://zh.wikipedia.org/wiki/ ): تاريخيًا، كانت هناك منظمتان حاولتا تصميم Unicode بشكل مستقل، وهما المنظمة الدولية للمعايير (ISO) وجمعية مصنعي البرامج (unicode. منظمة). قامت ISO بتطوير مشروع ISO 10646 وقام اتحاد Unicode بتطوير مشروع Unicode.
في حوالي عام 1991، أدرك كلا الجانبين أن العالم لا يحتاج إلى مجموعتين من الشخصيات غير المتوافقة. لذلك بدأوا في دمج عمل الطرفين والعمل معًا لإنشاء قائمة ترميز واحدة. بدءًا من Unicode2.0، يستخدم مشروع Unicode نفس الخطوط والخطوط المستخدمة في ISO 10646-1.
لا يزال كلا المشروعين موجودين وينشران معاييرهما الخاصة بشكل مستقل. أحدث إصدار من Unicode Consortium هو Unicode 4.1.0 في عام 2005. أحدث معيار ISO هو 10646-3:2003.
تحدد UCS كيفية استخدام وحدات البايت المتعددة لتمثيل نص مختلف. يتم تحديد كيفية إرسال هذه الترميزات في مواصفات UTF (تنسيق تحويل UCS) التي تتضمن UTF-8 وUTF-7 وUTF-16.
يصف RFC2781 وRFC3629 الخاصان بـ IETF طرق تشفير UTF-16 وUTF-8 بوضوح ووضوح ودقة في النمط المتسق لـ RFC. أنسى دائمًا أن IETF هو اختصار لـ Internet Engineering Task Force. ومع ذلك، فإن RFC الذي تحتفظ به IETF هو الأساس لجميع المواصفات الموجودة على الإنترنت.
3. يو سي إس-2، يو سي إس-4، بي إم بي
UCS يأتي في شكلين: UCS-2 وUCS-4. كما يوحي الاسم، يتم تشفير UCS-2 ببايتتين، ويتم تشفير UCS-4 بـ 4 بايت (في الواقع يتم استخدام 31 بت فقط، ويجب أن تكون أعلى بت 0). لنقم ببعض الألعاب الحسابية البسيطة:
يحتوي UCS-2 على 2^16=65536 نقطة ترميز، ويحتوي UCS-4 على 2^31=2147483648 نقطة ترميز.
يتم تقسيم UCS-4 إلى 2^7=128 مجموعة وفقًا لأعلى بايت حيث تكون أعلى بتة 0. يتم تقسيم كل مجموعة إلى 256 مستوى بناءً على البايت الأعلى التالي. وينقسم كل مستوى إلى 256 صفًا حسب البايت الثالث، ويحتوي كل صف على 256 خلية. وبطبيعة الحال، الخلايا الموجودة في نفس الصف تختلف فقط في البايت الأخير، والباقي هو نفسه.
المستوى 0 من المجموعة 0 يسمى المستوى الأساسي متعدد اللغات، أو BMP. أو في UCS-4، تُسمى بتات التعليمات البرمجية التي تحتوي على البايتتين العلويتين 0 باسم BMP.
يتم الحصول على UCS-2 عن طريق إزالة أول بايتتين صفريتين من BMP الخاص بـ UCS-4. أضف وحدتي بايت صفر أمام وحدتي بايت UCS-2 للحصول على BMP لـ UCS-4. لا توجد أحرف مخصصة خارج BMP في مواصفات UCS-4 الحالية.
4. تشفير UTF يقوم UTF-8 بتشفير UCS بوحدات 8 بت. التشفير من UCS-2 إلى UTF-8 هو كما يلي:
ترميز UCS-2 (سداسي عشري) دفق بايت UTF-8 (ثنائي)
0000-007F 0xxxxxxx
0080-07FF 110xxxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
على سبيل المثال، ترميز Unicode للحرف "الصيني" هو 6C49. يقع 6C49 بين 0800-FFFF، لذلك يجب عليك استخدام قالب 3 بايت: 1110xxxx 10xxxxxx 10xxxxxx. كتابة 6C49 بالثنائي هي: 0110 110001 001001. باستخدام تدفق البت هذا لاستبدال x في القالب بدوره، نحصل على: 11100110 10110001 10001001، وهو E6 B1 89.
يمكن للقراء استخدام برنامج "المفكرة" لاختبار ما إذا كان ترميزنا صحيحًا.
يقوم UTF-16 بتشفير UCS بوحدات 16 بت. بالنسبة لرموز UCS الأقل من 0x10000، فإن تشفير UTF-16 يساوي العدد الصحيح غير الموقع ذو 16 بت المطابق لرمز UCS. بالنسبة لرموز UCS التي لا تقل عن 0x10000، يتم تعريف خوارزمية. ومع ذلك، نظرًا لأن BMP الخاص بـ UCS2 أو UCS4 المستخدم فعليًا يجب أن يكون أقل من 0x10000، في الوقت الحالي، يمكن اعتبار أن UTF-16 وUCS-2 متماثلان بشكل أساسي. ومع ذلك، UCS-2 هو مجرد نظام تشفير، ويتم استخدام UTF-16 للإرسال الفعلي، لذلك يجب أخذ مسألة ترتيب البايت في الاعتبار.
5. يستخدم ترتيب بايت UTF وBOM
UTF-8 البايتات كوحدة ترميز، ولا توجد مشكلة في ترتيب البايت. يستخدم UTF-16 وحدتي بايت كوحدة تشفير قبل ترجمة نص UTF-16، يجب عليك أولاً فهم ترتيب البايتات لكل وحدة ترميز. على سبيل المثال، ترميز Unicode لـ "Kui" الذي تم تلقيه هو 594E، وترميز Unicode لـ "B" هو 4E59. إذا تلقينا دفق بايت UTF-16 "594E"، فهل هذا هو "Ku" أم "B"؟
الطريقة الموصى بها لوضع علامة على ترتيب البايت في مواصفات Unicode هي BOM. BOM ليست قائمة BOM الخاصة بـ "قائمة المواد"، ولكنها علامة ترتيب البايت. BOM هي فكرة ذكية بعض الشيء:
يوجد حرف يسمى "ZERO WIDTH NO-break SPACE" في ترميز UCS، وترميزه هو FEFF. FFFE هو حرف غير موجود في UCS، لذلك لا ينبغي أن يظهر في الإرسال الفعلي. توصي مواصفات UCS بأن نرسل الأحرف "ZERO WIDTH NO-break SPACE" قبل إرسال دفق البايت.
بهذه الطريقة، إذا استقبل المتلقي FEFF، فهذا يشير إلى أن دفق البايت هو Big-Endian؛ وإذا استقبل FFFE، فهذا يشير إلى أن دفق البايت هو Little-Endian. ولذلك فإن الحرف "ZERO WIDTH NO-break SPACE" يُسمى أيضًا BOM.
لا يتطلب UTF-8 وجود قائمة مكونات الصنف (BOM) للإشارة إلى ترتيب البايت، ولكن يمكنه استخدام قائمة مكونات الصنف (BOM) للإشارة إلى طريقة التشفير. ترميز UTF-8 للحرف "ZERO WIDTH NO-break SPACE" هو EF BB BF (يمكن للقراء التحقق منه باستخدام طريقة التشفير التي قدمناها سابقًا). لذا، إذا استقبل جهاز الاستقبال تدفق بايت يبدأ بـ EF BB BF، فإنه يعلم أنه مشفر بـ UTF-8.
يستخدم Windows BOM لوضع علامة على ترميز الملفات النصية.
6. مواد مرجعية إضافية المادة المرجعية الرئيسية لهذه المقالة هي "نظرة عامة قصيرة على ISO-IEC 10646 وUnicode" ( http://www.nada.kth.se/i18n/ucs/unicode-iso10646-oview.html ).
لقد وجدت أيضًا معلومتين تبدوان جيدتين، ولكن نظرًا لأنه كان لدي بالفعل إجابات لأسئلتي الأولية، لم أقرأهما:
"فهم يونيكود مقدمة عامة لمعيار يونيكود" ( http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&item_id=IWS-Chapter04a )
"أساسيات ترميز مجموعة الأحرف فهم ترميزات مجموعة الأحرف والترميزات القديمة" ( http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&item_id=IWS-Chapter03 )
لقد قمت بكتابة حزم برامج لتحويل UTF-8 وUCS-2 وGBK من وإلى بعضها البعض، بما في ذلك الإصدارات التي تستخدم Windows API والإصدارات التي لا تستخدم Windows API. إذا كان لدي وقت في المستقبل، فسوف أقوم بفرزه ووضعه على صفحتي الرئيسية الشخصية ( http://fmddlmyy.home4u.china.com ).
بدأت بكتابة هذا المقال بعد التفكير في كل القضايا التي اعتقدت أنني أستطيع الانتهاء منها في فترة من الوقت. وبشكل غير متوقع، استغرق الأمر وقتًا طويلاً للنظر في الصياغة والتحقق من التفاصيل، وكتبتها من الساعة 1:30 إلى الساعة 9:00 بعد الظهر. آمل أن يستفيد منه بعض القراء.
*/
#endregion