UTF-8: Unicode TransformationFormat-8bit، يُسمح بقائمة مكونات الصنف (BOM)، لكن عادةً لا يتم تضمين قائمة مكونات الصنف (BOM). وهو ترميز متعدد البايت يستخدم لحل الأحرف الدولية ويستخدم 8 بت (أي بايت واحد) للغة الإنجليزية و24 بت (ثلاثة بايت) للغة الصينية. يحتوي UTF-8 على أحرف تستخدمها جميع دول العالم، وهو ترميز دولي ويتميز بتعدد استخداماته. يمكن عرض النص المشفر UTF-8 على المتصفحات في العديد من البلدان التي تدعم مجموعة أحرف UTF8. على سبيل المثال، إذا كان ترميز UTF8، فيمكن أيضًا عرض اللغة الصينية على متصفح IE باللغة الإنجليزية للأجانب، ولا يحتاجون إلى تنزيل حزمة دعم اللغة الصينية الخاصة بـ IE.
GBK هو معيار يعتمد على المعيار الوطني GB2312 وتم توسيعه ليكون متوافقًا مع GB2312. يتم تمثيل ترميز النص لـ GBK بالبايتات المزدوجة، أي أن الأحرف الصينية والإنجليزية يتم تمثيلها بالبايتات المزدوجة، ومن أجل التمييز بين الأحرف الصينية، يتم تعيين أعلى البتات على 1. يحتوي GBK على جميع الأحرف الصينية وهو ترميز وطني وهو أقل تنوعًا من UTF8، لكن UTF8 يحتل قاعدة بيانات أكبر من GBD.
يجب تحويل GBK وGB2312 وما إلى ذلك إلى UTF8 من خلال تشفير Unicode:
GBK، GB2312--Unicode-UTF8
UTF8--يونيكود-GBK، GB2312
بالنسبة لموقع ويب أو منتدى، إذا كان هناك العديد من الأحرف الإنجليزية، فمن المستحسن استخدام UTF-8 لتوفير المساحة. ومع ذلك، فإن العديد من المكونات الإضافية للمنتدى تدعم الآن بشكل عام GBK فقط.
شرح تفصيلي للفرق بين الترميزات. ببساطة، رموز unicode وgbk وbig Five هي القيم المشفرة، وutf-8 وuft-16 وما شابه هي تعبيرات هذه القيمة. الرموز الثلاثة السابقة متوافقة مع نفس الحرف الصيني، وقيم الرموز الثلاثة مختلفة تمامًا. على سبيل المثال، تختلف قيمة فك التشفير لـ "Han" عن gbk. لنفترض أن قيمة فك التشفير هي a040 وgbk هي b030، ورمز uft-8 هو الشكل الذي يتم به التعبير عن هذه القيمة. كود utf-8 منظم بالكامل فقط لفك التشفير. إذا أراد GBK تحويله إلى UTF-8، فيجب تحويله إلى فك تشفير أولاً، ثم تحويله إلى utf-8 وهذا أمر جيد.
لمزيد من التفاصيل، راجع المقالة المعاد طباعتها أدناه.
دعونا نتحدث عن ترميز Unicode ونشرح بإيجاز مصطلحات مثل UCS وUTF وBMP وBOM. هذه قراءة مثيرة للاهتمام كتبها المبرمجون للمبرمجين. ما يسمى بالمتعة يعني أنه يمكنك بسهولة فهم بعض المفاهيم غير الواضحة سابقًا وتحسين معرفتك، وهو ما يشبه الترقية في لعبة آر بي جي. الدافع لتنظيم هذه المقالة هو سؤالان:
السؤال الأول:
باستخدام "حفظ باسم" في Windows Notepad، يمكنك التحويل بين طرق التشفير GBK وUnicode وUnicode big endian وUTF-8. أو يمكنك الانتقال مباشرة إلى http://www.knowsky.com/tools/utf8.asp للتحويل عبر الإنترنت.
وهو أيضًا ملف txt. كيف يتعرف Windows على طريقة التشفير؟
لقد اكتشفت منذ وقت طويل أن ملفات txt المشفرة Unicode وUnicode bigendian وUTF-8 ستحتوي على عدد قليل من البايتات الإضافية في البداية، وهي FF وFE (Unicode) وFE وFF (Unicode bigendian) وEF وBB وBF (UTF-8). ولكن ما هي المعايير التي تعتمد عليها هذه العلامات؟
السؤال الثاني:
لقد رأيت مؤخرًا برنامج ConvertUTF.c على الإنترنت، والذي يحقق التحويل المتبادل لـ UTF-32 وUTF-16 وUTF-8. أعرف بالفعل طرق التشفير مثل Unicode (UCS2) وGBK وUTF-8. لكن هذا البرنامج يجعلني في حيرة من أمري، ولا أستطيع أن أتذكر ما هي العلاقة بين UTF-16 وUCS2.
بعد التحقق من المعلومات ذات الصلة، قمت أخيرًا بتوضيح هذه المشكلات وتعلمت أيضًا بعض التفاصيل حول Unicode. اكتب مقالًا وأرسله إلى الأصدقاء الذين لديهم أسئلة مماثلة. تمت كتابة هذه المقالة بطريقة سهلة الفهم قدر الإمكان، ولكن يتعين على القراء معرفة ما هي البايتات وما هو النظام الست عشري.
0. إنديان كبير و إنديان صغير
إن endian الكبير وendian الصغير هما طريقتان مختلفتان لمعالجة وحدة المعالجة المركزية للأرقام متعددة البايت. على سبيل المثال، ترميز Unicode للحرف "汉" هو 6C49. لذا، عند الكتابة إلى ملف، هل يجب كتابة 6C في المقدمة أم كتابة 49 في المقدمة؟ إذا كان 6C مكتوبًا في المقدمة، فهو نهاية كبيرة. إذا تم كتابة 49 في المقدمة، فهو إنديان صغير.
كلمة "endian" تأتي من "رحلات جاليفر". كانت الحرب الأهلية في ليليبوت ناجمة عن كسر البيض من الإينديان الكبير أو الإينديان الصغير، ونتيجة لذلك، حدثت ستة ثورات، وفقد أحد الإمبراطور حياته، وفقد آخر العرش.
نترجم بشكل عام endian إلى "ترتيب البايت"، ويُطلق على endian الكبير و endian الصغير اسم "النهاية الكبيرة" و"النهاية الصغيرة".
1. ترميز الأحرف والرمز الداخلي بالمناسبة، يجب ترميز أحرف ترميز الأحرف الصينية قبل أن تتم معالجتها بواسطة الكمبيوتر. طريقة التشفير الافتراضية التي يستخدمها الكمبيوتر هي الكود الداخلي للكمبيوتر. استخدمت أجهزة الكمبيوتر المبكرة ترميز ASCII 7 بت من أجل معالجة الأحرف الصينية، صمم المبرمجون GB2312 للغة الصينية المبسطة وbig5 للصينية التقليدية.
يصف RFC2781 وRFC3629 الخاصان بـ IETF طرق تشفير UTF-16 وUTF-8 بوضوح ووضوح ودقة في النمط المتسق لـ RFC. أنسى دائمًا أن IETF هو اختصار لـ Internet Engineering Task Force. ومع ذلك، فإن RFC الذي تحتفظ به IETF هو الأساس لجميع المواصفات الموجودة على الإنترنت.
2.1 التعليمات البرمجية الداخلية وصفحة التعليمات البرمجية
حاليًا، تدعم نواة Windows بالفعل مجموعة أحرف Unicode، بحيث يمكن للنواة أن تدعم جميع اللغات في العالم. ومع ذلك، نظرًا لأن عددًا كبيرًا من البرامج والمستندات الموجودة تستخدم ترميزًا معينًا للغة، مثل GBK، فمن المستحيل على Windows عدم دعم الترميز الحالي وجميعها تستخدم Unicode.
يستخدم Windows صفحات الرموز للتكيف مع مختلف البلدان والمناطق. يمكن فهم صفحة الرموز على أنها التعليمات البرمجية الداخلية المذكورة سابقًا. صفحة الرموز المقابلة لـ GBK هي CP936.
تحدد Microsoft أيضًا صفحة الرموز لـ GB18030: CP54936. ومع ذلك، نظرًا لأن GB18030 يحتوي على بعض الترميزات ذات 4 بايت، وتدعم صفحة الرموز في Windows فقط الترميزات أحادية البايت ومزدوجة البايت، فلا يمكن استخدام صفحة الرموز هذه حقًا.
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 10xxxxxx10xxxxxx. كتابة 6C49 بالثنائي هي: 0110 110001 001001. باستخدام تدفق البت هذا لاستبدال x في القالب بدوره، نحصل على: 1110011010110001 10001001، وهو E6 B1 89.
يمكن للقراء استخدام برنامج "المفكرة" لاختبار ما إذا كان ترميزنا صحيحًا. تجدر الإشارة إلى أن UltraEdit سيتم تحويله تلقائيًا إلى UTF-16 عند فتح ملف نصي مشفر UTF-8، مما قد يسبب ارتباكًا. يمكنك إيقاف تشغيل هذا الخيار في الإعدادات. الأداة الأفضل هي Hex Workshop.
يقوم 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 البايتات كوحدة ترميز ولا توجد به مشكلات في endianness. يستخدم UTF-16 وحدتي بايت كوحدة تشفير قبل ترجمة نص UTF-16، يجب عليك أولاً فهم ترتيب البايتات لكل وحدة ترميز. على سبيل المثال، ترميز Unicode لـ "Kui" هو 594E، وترميز Unicode لـ "B" هو 4E59. إذا تلقينا دفق بايت UTF-16 "594E"، فهل هذا هو "Ku" أم "B"؟
الطريقة الموصى بها لوضع علامة على ترتيب البايت في مواصفات Unicode هي BOM. BOM ليست قائمة BOM الخاصة بـ "قائمة المواد"، ولكنها علامة ترتيب البايت. BOM هي فكرة ذكية بعض الشيء:
يوجد حرف يسمى "ZERO WIDTH NO-breakSPACE" في تشفير 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-breakSPACE" هو EF BB BF (يمكن للقراء التحقق منه باستخدام طريقة التشفير التي قدمناها سابقًا). لذا، إذا استقبل جهاز الاستقبال تدفق بايت يبدأ بـ EF BBBF، فإنه يعلم أنه مشفر بـ 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 بعد الظهر. آمل أن يستفيد منه بعض القراء.
الملحق 1 لنتحدث عن رمز الموقع GB2312 والرمز الداخلي وصفحة الرموز لا يزال لدى بعض الأصدقاء أسئلة حول هذه الجملة في المقالة:
"لا يزال النص الأصلي لـ GB2312 هو رمز المنطقة. ومن رمز المنطقة إلى الرمز الداخلي، تحتاج إلى إضافة A0 إلى البايت العالي والبايت المنخفض على التوالي."
اسمحوا لي أن أشرح ذلك بالتفصيل:
يشير "النص الأصلي لـ GB2312" إلى معيار وطني في عام 1980، "المجموعة الأساسية من مجموعات الأحرف الصينية المشفرة لتبادل المعلومات القياسية الوطنية لجمهورية الصين الشعبية GB2312-80". يستخدم هذا المعيار رقمين لتشفير الأحرف الصينية والرموز الصينية. الرقم الأول يسمى "المنطقة" والرقم الثاني يسمى "البت". لذلك يطلق عليه أيضًا رمز الموقع. المناطق 1-9 هي رموز صينية، والمناطق 16-55 هي أحرف صينية من المستوى الأول، والمناطق 56-87 هي أحرف صينية من المستوى الثاني. الآن لدى Windows أيضًا طريقة إدخال الموقع، على سبيل المثال، قم بإدخال 1601 للحصول على "ah". (يمكن لطريقة إدخال الموقع هذه التعرف تلقائيًا على رموز الموقع السداسية العشرية GB2312 والعشرية، مما يعني أن إدخال B0A1 سيحصل أيضًا على "ah".)
يشير الرمز الداخلي إلى ترميز الأحرف داخل نظام التشغيل. كان الكود الداخلي لأنظمة التشغيل المبكرة يعتمد على اللغة. يدعم Windows اليوم Unicode داخل النظام، ثم يستخدم صفحات التعليمات البرمجية للتكيف مع اللغات المختلفة. إن مفهوم "الكود الداخلي" غامض نسبيًا. تشير Microsoft عمومًا إلى الترميز المحدد بواسطة صفحة الرموز الافتراضية على أنه رمز داخلي.
لا يوجد تعريف رسمي لمصطلح الكود الداخلي، وصفحة الكود هي مجرد اسم شركة مايكروسوفت. كمبرمجين، طالما أننا نعرف ما هي، ليست هناك حاجة لفحص هذه المصطلحات كثيرًا.
ما يسمى بصفحة الرموز (صفحة الرموز) هو ترميز الأحرف للغة. على سبيل المثال، صفحة الرموز الخاصة بـ GBK هي CP936، وصفحة الرموز الخاصة بـ BIG5 هي CP950، وصفحة الرموز الخاصة بـ GB2312 هي CP20936.
لدى Windows مفهوم صفحة الرموز الافتراضية، أي الترميز الذي يتم استخدامه افتراضيًا لتفسير الأحرف. على سبيل المثال، يقوم Windows Notepad بفتح ملف نصي، والمحتوى الموجود بداخله عبارة عن دفق بايت: BA، BA، D7، D6. كيف يجب أن يفسرها Windows؟
هل يجب تفسيره وفقًا لترميز Unicode أو GBK أو BIG5 أو ISO8859-1؟ إذا قمت بتفسيرها وفقًا لـ GBK، فستحصل على كلمة "الأحرف الصينية". وفقًا لتفسيرات الترميز الأخرى، قد لا يتم العثور على الحرف المقابل، أو قد يتم العثور على الحرف الخطأ. ويعني ما يسمى بـ "الخطأ" أنه لا يتوافق مع الهدف الأصلي لمؤلف النص، ويتم إنتاج أحرف مشوهة.
الجواب هو أن Windows يفسر دفق البايت في الملف النصي وفقًا لصفحة الرموز الافتراضية الحالية. يمكن تعيين صفحة الرموز الافتراضية من خلال الخيارات الإقليمية في لوحة التحكم. يوجد عنصر ANSI في "حفظ باسم" في برنامج "المفكرة"، والذي يتم حفظه فعليًا وفقًا لأسلوب الترميز الخاص بصفحة الرموز الافتراضية.
الكود الداخلي لنظام التشغيل Windows هو Unicode، والذي يمكنه من الناحية الفنية دعم صفحات التعليمات البرمجية المتعددة في نفس الوقت. طالما أن الملف يمكنه شرح الترميز الذي يستخدمه وقام المستخدم بتثبيت صفحة الرموز المقابلة، فيمكن لـ Windows عرضه بشكل صحيح، على سبيل المثال، يمكن تحديد مجموعة الأحرف في ملف HTML.
يعتقد بعض مؤلفي ملفات HTML، وخاصة المؤلفين الإنجليز، أن كل شخص في العالم يستخدم اللغة الإنجليزية ولا يحددون مجموعة الأحرف في الملف. إذا كان يستخدم أحرفًا بين 0x80-0xff، وقام Windows الصيني بتفسيرها وفقًا لـ GBK الافتراضي، فستظهر أحرف مشوهة. في هذا الوقت، ما عليك سوى إضافة العبارة التي تحدد مجموعة الأحرف إلى ملف html، على سبيل المثال:
<meta http-equiv="Content-Type" content="text/html; charset=ISO8859-1">
إذا كانت صفحة الرموز المستخدمة من قبل المؤلف الأصلي متوافقة مع ISO8859-1، فلن تكون هناك أحرف مشوهة.
لنتحدث عن رمز الموقع، رمز موقع Ah هو 1601، وهو 0x10، 0x01 بالنظام الست عشري. وهذا يتعارض مع ترميز ASCII المستخدم على نطاق واسع بواسطة أجهزة الكمبيوتر. لكي تكون متوافقة مع ترميز ASCII 00-7f، نضيف A0 إلى البايتات العالية والمنخفضة لرمز المنطقة على التوالي. بهذه الطريقة، يصبح رمز "ah" B0A1. نحن أيضًا نطلق على الترميز مع إضافة اثنين من A0 كترميز GB2312، على الرغم من أن النص الأصلي لـ GB2312 لا يذكر ذلك على الإطلاق.