سؤال

يتم حفظ البرامج النصية الخاصة بي بالتأكيد في UTF-8. أنا في وضع إنشاء PDO مع "{$this->engine}:host={$this->host};dbname={$this->name};charset=UTF-8". تستخدم الجداول الخاصة بي innodb ويتم تجميعها باستخدام UTF8_General_CI. يتم إرسال صفحاتي إما مع Content-Type: text/html; charset=UTF-8 رأس أو <meta> ما يعادل.

عند استخدام PDO لتخزين حرف € ناشئ إما من إدخال HTTP أو سلسلة حرفية في الكود المصدري ، تركت مع c3 a2 e2 80 9a c2 ac وفقًا لـ MySQL Workbench 5.2. إن استرداد هذا من قاعدة البيانات وعرضه على الصفحة يعمل بشكل جيد. ومع ذلك ، في Phpmyadmin و Workbench ، أرى €.

عند استخدام هاتين الأداة لتخزين € ، غادرت مع e2 82 ac, ، وهو ما يبدو أنه تمثيل UTF-8 الصحيح ، ولكن إذا حاولت استرداد هذا باستخدام PHP ، يتم عرض �.

سؤالي هو ، من أين ينشأ هذا التناقض وهل من الممكن أن يكون لديك صفحات الويب وأدوات قاعدة البيانات الخاصة بي على حد سواء؟

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

المحلول

ينطبق توجيه charset في DSN فعليًا على MSSQL. أنا ببساطة بحاجة للتنفيذ SET NAMES. اسف بشأن ذلك.

لقد حققت ذلك:

parent::__construct("{$this->engine}:host={$this->host};dbname={$this->name}",
                    $this->user, $this->password,
                    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'"));

نصائح أخرى

ببساطة ، تحويل € إلى كيان HTML € لـ Superfix (ولكن قد تحصل على المشكلة مع chars الخاصة الأخرى)

الجانب الآخر من المشكلة (وبشكل أكثر تحديدا) هو التحقق من mySQL حرف _set_server والسبب الأكثر شيوعا حرف _set_client - أنظر أيضا: توصيل charsets

أيضًا ، من المهم أن نلاحظ أن meta equiv لا فرق ، فأنت بحاجة إلى ذلك دائماً اضبط الرأس ('نوع المحتوى: ...)

نظرًا لأن صفحة HTML صحيحة ، يبدو أنك تقوم بتخزين البيانات الصحيحة في قاعدة البيانات.

€ هو ترميز UTF-8 لعلامة اليورو التي يساء تفسيرها على أنها Windows-1252. يبدو أن أدوات Windows تستخدم ترميز "ANSI" بدلاً من ترميز قاعدة البيانات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top