1: يرسل النموذج البيانات في المقدمة في وضع النشر:
عندما يرسل المتصفح بيانات (من المفترض أنها "الصين") إلى الخادم، يجب عليه البحث عن جدول التعليمات البرمجية عند تحويل البيانات إلى بيانات ثنائية 0101 (من المفترض أن تكون 98 99). ما هو جدول التعليمات البرمجية الذي يستخدمه المتصفح لفتح الملف؟ صفحة الويب، سيحدد المتصفح جدول التعليمات البرمجية الذي سيتم إرسال البيانات به. بعد وصول البيانات إلى الخادم، يجب تغليف البيانات (98 99) في الطلب. يؤدي استدعاء طريقة getParameter للطلب في servlet إلى إرجاع سلسلة ("الصين"). تم تحويلها إلى أحرف. تأكد من التحقق من الكود. نظرًا لأن مصمم الطلب أجنبي، فإن الاستعلام الافتراضي هو ISO8859-1، وهو مصدر بيانات الطلب المشوهة.
انسخ رمز الكود كما يلي:
الحزمة com.yyz.request؛
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// أرسل النموذج في وضع النشر
الطبقة العامة RequestDemo تمتد HttpServlet {
doGet الفراغ العام (طلب HttpServletRequest، استجابة HttpServletResponse)
يلقي ServletException، IOException {
// مشكلة مشوهة في بيانات الطلب الصينية
request.setCharacterEncoding("UTF-8");// نحن نتحكم في صفحة الويب الخاصة بالعميل لتكون UTF-8
اسم مستخدم السلسلة = request.getParameter("اسم المستخدم");
// الحصول على البيانات أمر طبيعي، يمكنك التحقق من جداول التعليمات البرمجية المختلفة عند إخراج البيانات
Response.setCharacterEncoding("gb2312");// قم بإعلام الخادم بجدول التعليمات البرمجية للتشاور معه عند إرسال البيانات
Response.setContentType("text/html;charset=gb2312");// قم بإعلام المتصفح بجدول التعليمات البرمجية الذي سيتم فتحه
PrintWriter out = Response.getWriter();
out.write(اسم المستخدم);
}
doPost باطلة عامة (طلب HttpServletRequest، استجابة HttpServletResponse)
يلقي ServletException، IOException {
doGet(request,response);
}
2: يرسل النموذج البيانات في المقدمة في وضع الحصول:
لا يزال يتم إرسال البيانات المقدمة في طريقة get باستخدام جدول التعليمات البرمجية الذي يستخدمه المتصفح لفتحه. والفرق هو أنه عند إرسال البيانات في وضع الحصول، يكون ترميز إعداد الطلب غير صالح. حتى إذا تم تعيين UTF-8، فسيتم التحقق من ISO8859-1. احصل على (؟؟) لحل هذه المشكلة، عليك استخدام (؟؟) للتحقق العكسي من ISO8859-1. بعد الحصول على (98 99)، تحقق من جدول التعليمات البرمجية الصحيح.
انسخ رمز الكود كما يلي:
الحزمة com.yyz.request؛
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// أرسل النموذج عبر طريقة الحصول
الطبقة العامة RequestDemo تمتد HttpServlet {
doGet الفراغ العام (طلب HttpServletRequest، استجابة HttpServletResponse)
يلقي ServletException، IOException {
// مشكلة مشوهة في بيانات الطلب الصينية
request.setCharacterEncoding("UTF-8");// عند إرسال البيانات في وضع الحصول، يكون ترميز إعداد الطلب غير صالح. حتى إذا تم تعيين UTF-8، فسيتم التحقق من ISO8859-1.
اسم مستخدم السلسلة = request.getParameter("اسم المستخدم");
System.out.println(اسم المستخدم);
مصدر البايت [] = username.getBytes("iso8859-1");
اسم المستخدم = سلسلة جديدة (المصدر، "UTF-8")؛
System.out.println(اسم المستخدم);
}
doPost باطلة عامة (طلب HttpServletRequest، استجابة HttpServletResponse)
يلقي ServletException، IOException {
doGet(request,response);
}
}
ثالثاً: ملخص مشكلة الأحرف الصينية المشوهة في البيانات المقدمة:
1. إذا كانت طريقة الإرسال منشورة، فأنت بحاجة فقط إلى ضبط ترميز كائن الطلب إذا كنت تريد تجنب الأحرف المشوهة.
ملاحظة: تعتمد الطريقة التي يتم بها إرسال بيانات العميل على التشفير الذي يجب ضبط الطلب عليه.
2. إذا تم الحصول على طريقة الإرسال، فإن تعيين تشفير كائن الطلب غير صالح. إذا كنت تريد تجنب الأحرف المشوهة، فيمكنك تحويلها يدويًا فقط.
بيانات السلسلة = "؟؟؟؟؟؟؟؟";//سلسلة مشوهة
مصدر البايت [] = data.getBytes("iso8859-1");// احصل على البيانات الأصلية المقدمة من العميل
data = new String (data.getBytes("iso8859-1"),"UTF-8");//حل الأحرف المشوهة
// يساوي
البيانات = سلسلة جديدة (المصدر، "UTF-8")؛
3. يمكن أيضًا تحقيق التعليمات البرمجية المشوهة في طريقة get عن طريق تغيير تكوين الخادم. قم بتغيير ملف server.xml في دليل conf الخاص بـ Tomact.
3.1
لا يُنصح بهذا الأسلوب لأنه يغير الخادم ولا يتسم بالمرونة.
3.2
بعد هذا الإعداد، سيتم استخدام أي ترميز يتم تعيينه بواسطة setCharacterEncoding للطلب بواسطة الموصل. على الرغم من أنه أكثر مرونة من التغيير السابق، إلا أنه سيظل يتسبب في اعتماد تطبيقنا بشكل صارم على الخادم، ولا يوصى به.
رابعًا: أخيرًا، اسمحوا لي أن أذكر تفاصيل صغيرة: إذا كان عنوان URL متبوعًا ببيانات صينية، فيجب أن يكون عنوان URL مشفرًا. تتضمن المعلمات المقدمة في النموذج بيانات صينية، وسيساعدنا المتصفح تلقائيًا في تشفيرها، ومع ذلك، إذا تم إحضار المعلمات الصينية مباشرة من خلال الرابط، فلن يساعدنا المتصفح في تشفيرها مشكلة الأحرف الصينية المشوهة من خلال الطريقة الثانية أعلاه لا تعمل في بعض الأحيان، يجب عليك تشفيرها أولاً من خلال URLEncoding.encode("UTF-8").