سؤال

غالبًا ما يحدث أن شخصيات مثل é يتحول الى é, ، على الرغم من أن ترتيب قاعدة بيانات MySQL والجدول والحقل تم تعيينه على utf8_general_ci.الترميز في نوع المحتوى للصفحة تم ضبطها أيضًا على UTF8.

أعرف شيئًا عن utf8_encode/decode، لكنني لست متأكدًا تمامًا من مكان وكيفية استخدامه.

لقد قرأت "الحد الأدنى المطلق الذي يجب أن يعرفه كل مطور برامج بشكل مطلق وإيجابي عن Unicode ومجموعات الأحرف (بدون أعذار!)"مقالة، ولكني بحاجة إلى بعض المؤشرات المحددة لـ MySQL/PHP.

سؤال:كيف أتأكد من عدم تلف البيانات التي أدخلها المستخدم والتي تحتوي على أحرف دولية؟

هل كانت مفيدة؟

المحلول

في النظرة الأولى http://www.nicknettleton.com/zine/php/php-utf-8-cheatsheet أعتقد أن هناك شيئًا مهمًا مفقودًا (ربما تجاهلت هذا).اعتمادًا على تثبيت و/أو تكوين MySQL لديك، يتعين عليك ضبط تشفير الاتصال حتى يعرف MySQL التشفير الذي تتوقعه من جانب العميل (أي جانب العميل من اتصال MySQL، والذي يجب أن يكون برنامج PHP النصي الخاص بك).يمكنك القيام بذلك عن طريق إصدار ملف

SET NAMES utf8

الاستعلام قبل أي استعلام آخر ترسله إلى خادم MySQL.

إذا كنت تستخدم PDO على جانب PHP، فيمكنك إعداد الاتصال لإصدار هذا الاستعلام تلقائيًا عند كل (إعادة) اتصال باستخدام

$db=new PDO($dsn, $user, $pass);
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES utf8");

عند تهيئة اتصال قاعدة البيانات الخاصة بك.

نصائح أخرى

الترتيب ومجموعة الأحرف ليسا نفس الشيء.يجب أن يتطابق ترتيبك مع مجموعة الأحرف، لذا إذا كانت مجموعة الأحرف الخاصة بك هي utf-8، فيجب أن يتطابق الترتيب أيضًا.على الرغم من ذلك، فإن اختيار الترتيب الخاطئ لن يؤدي إلى تشويه بياناتك - فقط قم بإجراء مقارنة السلاسل/الفرز بشكل خاطئ.

ومع ذلك، هناك العديد من الأماكن، حيث يمكنك ضبط إعدادات مجموعة الأحرف في PHP.أنصحك باستخدام utf-8 طوال الوقت، إن أمكن.الأماكن التي تحتاج إلى تحديد مجموعة الأحرف هي:

  • قاعدة البيانات.يمكن تعيين ذلك على مستوى قاعدة البيانات والجدول والحقل، وحتى على مستوى كل استعلام.
  • الاتصال بين PHP وقاعدة البيانات.
  • إخراج HTTP؛تأكد من أن عنوان HTTP Content-Type يحدد UTF-8.يمكنك تعيين القيم الافتراضية في PHP وApache، أو يمكنك استخدام PHP header وظيفة.
  • إدخال HTTP.بشكل عام، سيتم إرسال النماذج بنفس مجموعة الأحرف التي تم تقديم الصفحة بها، ولكن للتأكد، يجب عليك تحديد accept-charset ملكية.تأكد أيضًا من أن عناوين URL مشفرة بـ utf-8، أو تجنب استخدام أحرف غير ascii في عناوين URL (ومعلمات GET).

utf8_encodeتمت تسمية وظائف /decode بشكل غريب بعض الشيء.يقومون بالتحويل على وجه التحديد بين latin1 (ISO-8859-1) وutf-8.إذا كان كل شيء في تطبيقك هو utf-8، فلن تضطر إلى استخدامها كثيرًا.

هناك ما لا يقل عن اثنين من الأخطاء فيما يتعلق بـ utf-8 و PHP.الأول هو أن وظائف السلسلة المضمنة في PHP تتوقع أن تكون السلاسل أحادية البايت.بالنسبة للعديد من العمليات، هذا لا يهم، لكنه يعني أنه لا يمكنك الاعتماد عليه strlen وغيرها من الوظائف.هناك تراجع جيد للقيود في هذه الصفحة.عادة، هذه ليست مشكلة كبيرة، ولكن خاصة عند استخدام مكتبات الجهات الخارجية، يجب أن تكون على دراية بأن الأمور قد تنفجر في هذا الشأن.أحد الخيارات أيضًا هو استخدام الامتداد mb_string، الذي لديه خيار استبدال جميع الوظائف المزعجة ببدائل مدركة لـ utf-8.لا يزال هذا الحل ليس مضادًا للرصاص بنسبة 100%، لكنه سيعمل في معظم الحالات.

هناك مشكلة أخرى وهي أن بعض عمليات تثبيت PHP لا تزال تحتوي على ملحق magic_quotes تم تشغيل الإعداد.هذه المشكلة متعامدة مع utf-8، ولكنها قد تؤدي إلى بعض الخدش في الرأس.أطفئه، من أجل سلامتك العقلية.

ليس هناك الكثير مما يمكن قوله والذي لم تتناوله هذه المقالة

http://developer.loftdigital.com/blog/php-utf-8-cheatsheet

الأشياء التي يجب عليك القيام بها:

  • تأكد من قيام Apache بنشر محتوى UTF-8.قم بذلك في httpd.conf، أو استخدم PHP header()-وظيفة للقيام بذلك يدويا.
  • تأكد من أن اتصال قاعدة البيانات لديك هو UTF8. SET NAMES utf8 عمل الحيلة.
  • تأكد من ضبط جميع جداولك على UTF8.
  • تأكد من ترميز جميع ملفات PHP وملفات القالب بتنسيق UTF8 إذا قمت بتخزين أحرف دولية فيها.

لا يتعين عليك عادةً القيام بالكثير باستخدام mb_string أو utf8_encode/decode-الوظائف عند القيام بذلك.

للحصول على صحة يونيكود أفضل، يجب عليك استخدام utf8_unicode_ci (على الرغم من أن الوثائق غامضة بعض الشيء فيما يتعلق بالاختلافات).يجب عليك أيضًا التأكد من تعيين إشارات Mysql التالية بشكل صحيح -

  • default-character-set=utf8
  • Skip-character-set-client-handshake // مهم حتى لا يفرض العميل ترميزًا آخر

يمكن تعيينها في ملف تكوين mysql (ضمن علامة التبويب [mysqld]) أو في وقت التشغيل عن طريق إرسال الاستعلامات المناسبة.

بغض النظر عن اللغة المكتوبة بها، إذا كنت تريد إنشاء تطبيق يسمح بمجموعة واسعة من الترميزات، فقم بالتعامل معه على شكل أجزاء:

  • التعرف على الترميز
    • بطريقة ما تريد معرفة نوع الترميز الذي تتعامل معه، وإلا، فمن غير المجدي التفكير في الأمر أكثر.سوف ينتهي بك الأمر مع الأحرف غير المرغوب فيها.
  • التعامل مع البايتات الخاصة بك
    • فكر في هذه السلاسل بشكل أقل شبهاً بـ "سلاسل" من الأحرف، وأكثر شبهاً بقوائم البايتات
    • PHP متستر بشكل خاص.لا تدع ذلك يقتطع البيانات الخاصة بك على الطاير.إذا كنت تعيد صياغة سلسلة UTF-8، فتأكد من تعريفها على هذا النحو
  • مخزن لشاشات الكريستال السائل
    • مرة أخرى، أنت لا تريد اقتطاع البيانات.إذا كنت تقوم بتخزين جملة باللغة الإنجليزية، فهل يمكنك أيضًا تخزين مجموعة من الحروف الرسومية بلغة الماندرين؟ماذا عن اللغة العربية؟أي من هذه سوف تتطلب أكبر مساحة؟حساب لذلك.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top