سؤال

لدي السيناريو php الذي يصل MSSQL2005 قاعدة البيانات على ما يلي بعض البيانات منه و يرسل النتائج في البريد.

هناك أحرف خاصة في كل من بعض أسماء الأعمدة في المجالات نفسها.

عندما كنت الوصول إلى البرنامج النصي من خلال المتصفح (خادم الويب iis) ، يتم تنفيذ الاستعلام بشكل صحيح و محتويات البريد بشكل صحيح (على جمهوري) المشفرة.ومع ذلك ، عندما كنت تنفيذ php من وحدة التحكم ، يفشل الاستعلام (بسبب أحرف خاصة في أسماء الأعمدة).إذا قمت باستبدال الأحرف الخاصة في الاستعلام تدعو إلى chr() و رمز الحرف في اللاتيني-1, الاستعلام يحصل على تنفيذها بشكل صحيح ، ولكن النتائج هي أيضا ترميز latin-1 وبالتالي لا يتم عرض بشكل صحيح في البريد.لماذا PHP/MSSQL سائق/... باستخدام ترميز مختلفة في اثنين من السيناريوهات ؟ هل هناك طريقة للتغلب على ذلك ؟

إذا كنت أتساءل, أنا في حاجة إلى وحدة التحكم لأنني أريد أن جدول البرنامج النصي باستخدام SQLAgent (أو يبرد أو أيا كان).

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

المحلول

اعتمادا على نوع من الشخصيات لديك في قاعدة البيانات الخاصة بك, قد يكون وحدة القيد أعتقد.إذا كنت نوع chcp في وحدة التحكم, سوف نرى ما هو صفحة الرموز النشطة ، والتي قد شيئا مثل CP437 المعروف أيضا باسم ASCII الموسعة.إذا كان لديك شخصيات من هذا كود الصفحة ، مثل في UTF8, كنت قد واجهت مشاكل.يمكنك تغيير النشط الحالي رمز الصفحة عن طريق كتابة chcp 65001 للتبديل إلى UTF8.

قد تحتاج أيضا إلى تغيير الافتراضي النقطية خط Lucida Console اعتمادا على الأحرف المطلوبة وليس كل خطوط الدعم الأحرف الموسعة (انقر بزر الماوس الأيمن على نافذة "موجه الأوامر" عنوان خصائص الخط).

كما سبق أن قلت, PHP دعم يونيكود ليست مثالية, ولكن يمكنك إدارة أن تفعل ذلك في PHP5 مع بعض في وضع جيد استدعاء دالة من utf8_decode.سر ترميز الأحرف هو أن نفهم جيدا ما هو ترميز كل الأدوات التي تستخدم:بيانات اتصال قاعدة البيانات الحالية بايت في متغير PHP, الإخراج الخاص بك إلى شاشة وحدة التحكم, البريد الإلكتروني الخاص بك الجسم ترميز عميل البريد الإلكتروني الخاص بك ، وهلم جرا...

على كل شيء أن يكون أحرف خاصة في الأيام الحديثة ، شيء مثل UTF8 غالبا ما يوصى.تأكد من أن كل شيء على طول الطريق هو UTF8 وتحويل فقط عند الضرورة.

نصائح أخرى

ودعم PHP الضعيف للعالم غير الإنجليزية هو معروف. لم يسبق لي ان تستخدم قاعدة بيانات مع شخصيات خارج نطاق ASCII الأساسية، ولكن من الواضح أن لديك بالفعل عمل حول ويبدو عليك أن تعيش معها.

إذا كنت تريد أن تأخذ خطوة أخرى، يمكن لك: 1. كتابة صفيف يحتوي على جميع أحرف خاصة ومكافئات لجنة حقوق الإنسان الخاصة بهم 2. foreach مجموعة وstr_replace على الاستعلام

ولكن إذا كان الاستعلام ضمني، أعتقد أن ما لديك على ما يرام. أيضا، تأكد من أنك تستخدم أحدث PHP، على الأقل 4.4.x، وهناك دائما تغيير تم إصلاح هذا لكنني منزوع الدسم ملاحظات الإصدار 4.x.x وأنا لا أرى أي شيء يتعلق مشكلتك.

ووالشيء المهم أن نتذكر حول سلاسل PHP هو أنها تيارات بايت. إذا كنت ترغب في الحصول على البيانات في مجموعة الأحرف الصحيحة (على كل ما تقومون به)، لديك للقيام بذلك بشكل واضح من خلال نوع من وظيفة أو التصفية. كل شيء جدا على مستوى منخفض.

واعتمادا على الإعداد الخاص بك، قد تحتاج إلى معرفة الطابع الداخلي مجموعة من السلاسل في قاعدة البيانات، ولكن على الأقل كنت بحاجة إلى معرفة ما مجموعة الأحرف قاعدة البيانات يرسل إلى PHP (ل، تذكر، لPHP انها مجرد تيار بايت).

وبعد ذلك عليك أن تعرف مجموعة الأحرف الهدف (وربما تحديد ذلك، والتي كنت حقا ينبغي على أي حال). على سبيل المثال، ويقول أن كنت تحصل على UTF-8 من قاعدة البيانات، ولكنها ترغب في إرسال اللاتينية-1 (وبالتالي base64 في أو ف طباعة مشفرة باسم 'محتوى نقل ترميز'):

$send_string = base64_encode(utf8_decode($database_string));

وبالطبع في هذه الحالة، سوف عليك أن تعرف أن جميع UTF-8 أحرف موجودة في مجموعة الأحرف اللاتينية-1، وربما كنت لا تريد حقا base64 في (PHP للأسف لايوجد * هل جيدة وظيفة الترميز للطباعة، على الرغم من الغريب، فإنه لا من أجل فك رموز)، وإذا كنت لا أتحدث عن UTF-8 <=> اللاتينية-1 سترغب في جلد بمهام المقاطع متعددة البايتات بدلا من ذلك.

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

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