لقد أزعجت مشكلة التشفير الصيني في برمجة PHP الكثير من الأشخاص، والسبب في هذه المشكلة بسيط جدًا في الواقع. وتشترط كل دولة (أو منطقة) مجموعة ترميز الأحرف لتبادل معلومات الكمبيوتر، مثل كود ASCII الموسع في الولايات المتحدة وأمريكا. GB2312 في الصين -80، JIS في اليابان، وما إلى ذلك. كأساس لمعالجة المعلومات في هذا البلد/المنطقة، تلعب مجموعات ترميز الأحرف دورًا مهمًا في توحيد الترميز. يتم تقسيم مجموعات ترميز الأحرف إلى فئتين وفقًا للطول: SBCS (مجموعة أحرف أحادية البايت) وDBCS (مجموعة أحرف مزدوجة البايت). في البرامج المبكرة (خاصة أنظمة التشغيل)، من أجل حل معالجة الكمبيوتر لمعلومات الأحرف المحلية، ظهرت إصدارات محلية مختلفة (L10N)، ومن أجل التمييز، تم تقديم مفاهيم مثل LANG وCodepage. ومع ذلك، نظرًا لتداخل نطاقات التعليمات البرمجية لمجموعات الأحرف المحلية المختلفة، فمن الصعب تبادل المعلومات مع بعضها البعض؛ حيث تكون تكلفة الصيانة المستقلة لكل إصدار مترجم من البرنامج مرتفعة. لذلك، من الضروري استخلاص القواسم المشتركة في أعمال التوطين ومعالجتها بشكل متسق لتقليل محتوى معالجة التوطين الخاص. وهذا ما يسمى أيضًا بالتدويل (118N). يتم توحيد المعلومات اللغوية المختلفة بشكل أكبر كمعلومات محلية. أصبحت مجموعة الأحرف الأساسية التي تمت معالجتها هي Unicode، والتي تحتوي على جميع الحروف الرسومية تقريبًا.
في الوقت الحاضر، تعتمد معظم معالجة الأحرف الأساسية للبرامج ذات الخصائص الدولية على Unicode. عند تشغيل البرنامج، يتم تحديد إعدادات ترميز الأحرف المحلية المقابلة وفقًا لإعدادات اللغة/اللغة/صفحة الشفرة في ذلك الوقت، ويتم تحديد الأحرف المحلية. معالجتها وفقا لذلك. أثناء المعالجة، من الضروري تحقيق التحويل المتبادل بين Unicode ومجموعات الأحرف المحلية، أو حتى التحويل المتبادل بين مجموعتين مختلفتين من الأحرف المحلية مع Unicode كوسط. يتم توسيع هذه الطريقة بشكل أكبر في بيئة الشبكة، وأي معلومات أحرف على طرفي الشبكة تحتاج أيضًا إلى تحويلها إلى محتوى مقبول وفقًا لإعدادات مجموعة الأحرف.
مشكلات ترميز مجموعة الأحرف في قواعد البيانات
تدعم جميع أنظمة قواعد البيانات العلائقية الشائعة ترميز مجموعة أحرف قاعدة البيانات، مما يعني أنه يمكنك تحديد إعدادات مجموعة الأحرف الخاصة بها عند إنشاء قاعدة بيانات، ويتم تخزين بيانات قاعدة البيانات بالترميز المحدد. عندما يصل أحد التطبيقات إلى البيانات، سيكون هناك تحويل لترميز مجموعة الأحرف عند نقطتي الدخول والخروج. بالنسبة للبيانات الصينية، يجب أن يضمن إعداد ترميز أحرف قاعدة البيانات سلامة البيانات. GB2312، GBK، UTF-8، وما إلى ذلك كلها ترميزات اختيارية لمجموعة أحرف قاعدة البيانات، يمكننا أيضًا اختيار ISO8859-1 (8 بت)، ولكن يتعين علينا تحويل حرف صيني 16 بت أو Unicode قبل
التطبيق؛
يكتب البياناتإلى حرفين 8 بت، بعد قراءة البيانات، تحتاج إلى دمج البايتتين وتحديد أحرف SBCS، لذلك، لا نوصي باستخدام ISO8859-1 كترميز لمجموعة أحرف قاعدة البيانات. لا يقتصر الأمر على عدم الاستفادة الكاملة من دعم ترميز مجموعة الأحرف لقاعدة البيانات نفسها، ولكنه يزيد أيضًا من تعقيد البرمجة. عند البرمجة، يمكنك أولاً استخدام وظائف الإدارة التي يوفرها نظام إدارة قاعدة البيانات للتحقق مما إذا كانت البيانات الصينية صحيحة.
قبل الاستعلام عن قاعدة البيانات، يقوم برنامج PHP أولاً بتنفيذ mysql_query("SET NAMES xxxx"); حيث يكون xxxx هو ترميز صفحة الويب الخاصة بك (charset=xxxx) إذا كان charset=utf8 في صفحة الويب، ثم xxxx=utf8، إذا كان charset=utf8 =gb2312 في صفحة الويب، ثم xxxx=gb2312، تحتوي جميع برامج الويب تقريبًا على رمز مشترك للاتصال بقاعدة البيانات، والذي يتم وضعه في ملف، فقط أضف mysql_query("SET NAMES xxxx").
يُظهر SET NAMES مجموعة الأحرف المستخدمة في عبارة SQL المرسلة من قبل العميل. ولذلك، فإن عبارة SET NAMES 'utf-8' تخبر الخادم بأن "المعلومات المستقبلية من هذا العميل ستستخدم مجموعة الأحرف utf-8." كما أنه يحدد أيضًا مجموعة الأحرف للنتائج التي يرسلها الخادم مرة أخرى إلى العميل (على سبيل المثال، إذا كنت تستخدم عبارة SELECT، فإنها تشير إلى مجموعة الأحرف المستخدمة لقيم الأعمدة).
عادةً ماتستخدم الأساليب الشائعة الاستخدام عند
تحديد موقع مشكلات الترميز الصيني الطريقة الأكثر غباءً والأكثر فاعلية - وهي طباعة الكود الداخلي للسلسلة بعد معالجتها بواسطة البرنامج الذي تعتقد أنه مريب. من خلال طباعة الكود الداخلي لسلسلة ما، يمكنك معرفة متى يتم تحويل الأحرف الصينية إلى Unicode، ومتى يتم تحويل Unicode مرة أخرى إلى رمز داخلي صيني، ومتى يتحول حرف صيني واحد إلى حرفين Unicode، ومتى يتم تحويل سلسلة صينية إلى سلسلة من علامات الاستفهام، متى تم اقتطاع البتات عالية الترتيب من سلسلة الأحرف الصينية...
يمكن أن يساعد أخذ سلسلة عينة مناسبة أيضًا في تمييز نوع السؤال. على سبيل المثال: " aaahaa?@aa " والسلاسل الأخرى البديلة بين الصينية والإنجليزية، والتي تحتوي على أحرف مميزة لكل من GB وGBK. بشكل عام، لن يتم تشويه الأحرف الإنجليزية بغض النظر عن كيفية تحويلها أو معالجتها (إذا واجهتها، يمكنك محاولة زيادة طول الحروف الإنجليزية المتتالية).
حل مشاكل التعليمات البرمجية المشوهة في التطبيقات المختلفة
1) استخدم العلامات لتعيين ترميز الصفحة،
وتتمثل وظيفة هذه العلامة في الإعلان عن مجموعة الأحرف التي يستخدمها متصفح العميل لعرض الصفحة MySQL، وهو UTF8) وما إلى ذلك. ولذلك، يمكن لمعظم الصفحات استخدام هذه الطريقة لإخبار المتصفح بالتشفير الذي يجب استخدامه عند عرض هذه الصفحة، وذلك لتجنب أخطاء التشفير والأحرف المشوهة. ولكن في بعض الأحيان نجد أن هذه الجملة لا تزال لا تعمل، بغض النظر عن xxx، فإن المتصفح يستخدم دائمًا نفس التشفير، وسأتحدث عن هذا الموقف لاحقًا.
يرجى ملاحظة أنها تنتمي إلى معلومات HTML وهي مجرد عبارة تشير فقط إلى أن الخادم قد قام بتمرير معلومات HTML إلى المتصفح.
2) header("content-type:text/html; charset=xxx");
وظيفة رأس الوظيفة هذه () هي إرسال المعلومات الموجودة بين قوسين إلى رأس http. إذا كان المحتوى الموجود بين قوسين كما هو مذكور في المقالة، فإن الوظيفة هي في الأساس نفس التسمية، وإذا قارنتها بالأولى، فستجد أن الأحرف متشابهة. لكن الفرق هو أنه إذا كانت هناك هذه الوظيفة، فسيستخدم المتصفح دائمًا ترميز xxx الذي طلبته ولن يعصيه أبدًا، لذا فإن هذه الوظيفة مفيدة جدًا. لماذا يحدث هذا إذن علينا أن نتحدث عن الفرق بين رأس http ومعلومات HTML:
رأس http عبارة عن سلسلة يرسلها الخادم قبل إرسال معلومات HTML إلى المتصفح باستخدام بروتوكول http. تنتمي العلامة إلى معلومات HTML، لذا فإن المحتوى المرسل بواسطة header() يصل إلى المتصفح أولاً. النقطة الشائعة هي أن header() له أولوية أعلى (لا أعرف إذا كان بإمكاني قول ذلك). إذا كانت صفحة php تحتوي على كل من header("content-type:text/html;charset=xxx") وheader("content-type:text/html;charset=xxx")، فلن يتعرف المتصفح إلا على رأس http السابق و ليس الفوقية. بالطبع، لا يمكن استخدام هذه الوظيفة إلا داخل صفحات php.
هناك أيضًا سؤال متبقي، لماذا يعمل الأول بالتأكيد، لكن الأخير لا يعمل أحيانًا، وهذا هو سبب حديثنا عن Apache بعد ذلك؟
3) AddDefaultCharset
في مجلد conf في الدليل الجذر لـ Apache، يوجد مستند تكوين Apache بالكامل httpd.conf.
افتح httpd.conf باستخدام محرر النصوص، ويحتوي السطر 708 (قد يكون مختلفًا في الإصدارات المختلفة) على AddDefaultCharset xxx، حيث يكون xxx هو اسم الترميز. معنى سطر التعليمات البرمجية هذا: قم بتعيين مجموعة الأحرف في رأس http لملف صفحة الويب في الخادم بأكمله على مجموعة الأحرف xxx الافتراضية الخاصة بك. وجود هذا السطر يعادل إضافة رأس ("نوع المحتوى: نص/html؛ مجموعة الأحرف = xxx") إلى كل ملف. يمكنك الآن فهم سبب استخدام المتصفح دائمًا لـ gb2312 على الرغم من أنه تم ضبطه على utf-8.
إذا كان هناك رأس ("content-type:text/html; charset=xxx") في صفحة الويب، فسيتم تغيير مجموعة الأحرف الافتراضية إلى مجموعة الأحرف التي قمت بتعيينها، لذلك ستكون هذه الوظيفة مفيدة دائمًا. إذا قمت بإضافة "#" أمام AddDefaultCharset xxx، وقمت بالتعليق على هذه الجملة، ولم تحتوي الصفحة على رأس ("نوع المحتوى...")، فقد حان دور العلامة التعريفية لتصبح سارية المفعول.
ترتيب الأولوية لما سبق مدرج أدناه:
.. header("content-type:text/html; charset=xxx")
.. AddDefaultCharset xxx
..
إذا كنت مبرمج ويب، فمن المستحسن إضافة رأس لكل منها من صفحاتك ("نوع المحتوى: نص/html؛ مجموعة الأحرف = xxx")، مما يضمن إمكانية عرضه بشكل صحيح على أي خادم ويتمتع بإمكانية نقل قوية.
4) تكوين Default_charset في php.ini:
يحدد default_charset = "gb2312" في php.ini مجموعة أحرف اللغة الافتراضية لـ php. يوصى عمومًا بالتعليق على هذا السطر والسماح للمتصفح بتحديد اللغة تلقائيًا بناءً على مجموعة الأحرف في رأس صفحة الويب بدلاً من تقديم متطلبات إلزامية، بحيث يمكن توفير خدمات الويب بلغات متعددة على نفس الخادم.
الاستنتاج:
في الواقع، الترميز الصيني في تطوير PHP ليس معقدًا كما يتصور، على الرغم من عدم وجود قواعد ثابتة لتحديد المواقع وحل المشكلات، كما تختلف بيئات التشغيل المختلفة، إلا أن المبادئ الأساسية هي نفسها. إن فهم معرفة مجموعات الأحرف هو الأساس لحل مشاكل الشخصية. ومع ذلك، مع التغييرات في مجموعة الأحرف الصينية، لن تظل برمجة PHP فحسب، بل أيضًا مشاكل في معالجة المعلومات الصينية موجودة لبعض الوقت.