- 0
سجل دخول لمتابعه هذا
متابعين
0

الطريق الوردية في دعم اللغه العربيه
بواسطة
daziplqa,
-
يستعرض القسم حالياً 0 members
لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .
بواسطة
daziplqa,
لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .
تم النشر منذ (معدل)
بسم الله الرحمن الرحيم
السلام عليكم,,
لعل كثر منا يواجه مشاكل في دعم اللغه العربيه عند البرمجه ب JSP/Servlet و باقي منصات الويب في الجافا (مثل struts و JSF ,, إلخ)
و لعل الكثر من أساتذتنا قد كتبوا في هذا الموضوع, ولعل هذا الموضوع يكون نقطة في بحر, و لكن بصدري علم أريد أن أخرجه لكم.
أولا, الويب في الجافا (و أي ويب) مبني علي إرسال طلب Http أي (Http Request ) للخادم, و إستقبال رد منه (Http Response).
أنواع الطلب في ال Http:
1- GET
2- POST
3- PUT
4- DELETE
5- و أخرون...
بالنسبه لمظم تطبيقاتنا, فنحن لانستخدم إلا أول نوعين GET و POST.
فعند إرسال طلب من نوع GET يكون شكل الطلب كالتالي:
وبالتالي البيانات التي يقوم المستخدم بإرسالها, ترسل في رأس الطلب (request header)
أما عند إرسال طلب من نوع POST, فإن البيانات التي يقوم المستخدم بإرسالها تكون في بطن الطلب (request body)
و بالتالي فنحن لا نراها في مربع الطلب الخاص بالمتصفح.
إرسال أحرف عربيه
فإن إرسال أحرف عربيه سواء ك GET أو ك POST يتطلب منك عملا زائدا, و نحن بصدد التحدث عنه في هذا الموضوع.
بالنسبه ل POST فالموضوع في الجافا ليس صعبا, لأن الداله setCharacterEncoding داخل الفئة HttpServletRequest , تقوم بتصحيح ال encoding الخاص ببطن الطلب (request body ) .
من وثائق الجافا:
و بالتالي, كما قلنا, فإنها تصحح (set) ال encoding لبطن الطلب,,
و إستخدام الداله
كاف جداً.
إذن ماذا لو كان الطلب من نوع GET ؟
قصة كبيييره جدا,
دعونا نبدأها,
عندما يقوم المتصفح (أو أي عميل HTTP) بإرسال الطلب للخادم, و إن كان العميل يستخدم الطريقه GET, فإن العميل لايرسل إلا الأحرف اللاتنينيه كما هي, أما باقي الأحرف فإنها يقوم بتحويلها قبل إرسالها (و هذه العمليه هي التي يطلع عيها URL-Encoding )
فمثلا كلنا يعرف أن الرمز %20 يمثل مسافه (space), و يختلف هذا التمثيل طبقا لنوع ال encoding المستخدم لعمل ال URL-Encoding ,
فمثلا حرف "أ" عند عمل URL-Encoding له ب ال UTF-8 , فإنه يعطي شئ, و عند عمل URL-Encoding له ب encoding أخر مثل ISO-8859-6, فإنه يعطي رمز أخر.
لرؤية ذلك, قم بتنفيذ هذا المثال:
ولاحظ الناتج :
إذن, كما قلنا , فالمتصفح قبل أن يرسل أحرف non-ASCII (كما هو الحال في حالة اللغه العربيه), فإنه سوف يقوم بعمل url-encoding لها.
لكن السؤال هنا, ما هو نوع ال encoding الذي سوف يتستخدمه المتصفح ؟؟
أنت من يخبر المتصفح بإستخدام encoding معين , عن طريق أن تضع الكود التالي فصفحة ال JSP الخاصه بك:
و في حالة الصفحات من نوع HTML فقط, يكفي السطر التالي:
<
أنت هنا, تطلب من المتصفح أن يعمل url-encoding للبيانات التي سوف ترسلها للخادم ب UTF-8 (و هي كاف جدا للغه العربيه)
لكن لاحظ, يجب من الخادم أن يعرف مسبقا ما هو نوع ال encoding الذي تم به عمل url-encoding للبيانات التي سوف تأتي إليه,, (و حيث أنك ستكن المطور للصفحات و الخادم معا, فستتحكم فكلا الطرفين )
حسنا, بالنسبه للخادم ( ال Servlet الخاص بك),
بالنسبه لل POST كما ذكرنا فإن إستخدام :
بعد أن تقوم بمناداة
كاف جدا,,
إذا, ماذا عن GET؟؟ لا الأمر مختلف, بالنسب ل GET فلو إستخدمت request.getParameter مباشرة, فإنك سوف تحصل على بيانات مخطئة (corrupted data)
إذا, الحل هو إستخدام الدالة request.getQueryString() و هي تقوم بإسترجاع ال query string كاملا لك,
و ال query string هو ما يكون في نهاية الطلب و يكون بالشكل :
بعد الحصول على ال query string, نقوم بعمل URL-Decode له (لأن المتصفح قام بعمل url-encoding له), و عند عمل url-decoding نستخدم نفس ال encoding الذي إستخدم المتصفح:
لاحظ المثال التالي:
لاحظ الناتج:
إذن أنت تحتاج أن تعمل URL-decoding بنفس ال encoding الخاص بالصفحة التي قام المتصفح بإرسالها لك,,
المثال التالي به كود يقوم بمعالجة مشكلة اللغة العربيه لكلا الطريقتين POST و GET:
أولا, صفحة ال JSP:
و هذه هي الفئة التي تقوم بتصحيح ال ENCODING في حالة GET:
و هذه Filter يصحح ال encoding في حالة POST و يستخدم الفئة السابقة لتصحيح ال encoding في حالة GET:
و هذا ال Mapping الخاص به (يقوم بتقطيع جميع الطلبات للخادم ):
و هذا ال Servlet للإختبار :
لقد قمت بإرفاق هذه المثال لكي تعم الفائده,
أرجو من الأخوه المشرفين النظر في تثبيت هذا الموضوع نظرا لاهميته (بالنسبالي, أنا موافق , ههههههههه)
المراجع:
http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol
http://en.wikipedia.org/wiki/POST_%28HTTP%29
http://java.sun.com/developer/technicalArticles/Intl/HTTPCharset/
http://balusc.blogspot.com/2009/05/unicode-how-to-get-characters-right.html
test.zip
تم تعديل بواسطه {هويدي}شارك هذا الرد
رابط المشاركة
شارك الرد من خلال المواقع ادناه