حل مشكلة jsp المشوهة
15-07-2009 10:32
1. سبب تشويه صفحة JSP هو عدم تحديد ترميز مجموعة الأحرف في الصفحة. الحل: فقط استخدم الكود التالي في بداية الصفحة لتحديد ترميز مجموعة الأحرف، <%@ page contentType=. "نص /html؛ مجموعة الأحرف = gb2312" %>
2. سيؤدي هذا النوع من الأحرف المشوهة في قاعدة البيانات إلى أن تصبح الأحرف الصينية التي تقوم بإدراجها في قاعدة البيانات أحرفًا مشوهة، أو أن الأحرف الصينية التي تدرجها في قاعدة البيانات ستكون أيضًا أحرفًا مشوهة عند قراءتها وعرضها :
إضافة مجموعة الأحرف المشفرة إلى سلسلة اتصال قاعدة البيانات (وينطبق الشيء نفسه على اتصالات مصدر البيانات)
عنوان URL للسلسلة = "jdbc:mysql://localhost/digitgulf؟
user=root&password=root&useUnicode=true&characterEncoding=GB2312";
واستخدم الكود التالي في الصفحة:
Response.setContentType("text/html;charset=gb2312");
request.setCharacterEncoding("gb2312");
3. أحرف مشوهة عند تمرير اللغة الصينية كمعلمة عندما نقوم بتمرير حرف صيني كمعلمة إلى صفحة أخرى، ستظهر أحرف مشوهة أيضًا. والحل هو كما يلي:
تشفير المعلمات عند تمرير المعلمات، مثل RearshRes.jsp?keywords=" + java.net.URLEncoder.encode(keywords)
ثم استخدم العبارة التالية في صفحة المعلمة المتلقية لتلقي الكلمات الرئيسية=new String(request.getParameter("keywords").getBytes("8859_1"));
لا تزال المشكلة الأساسية للأحرف المشوهة هي مشكلة ترميز مجموعة الأحرف، وطالما تم إتقانها، يمكن حل مشكلات التعليمات البرمجية المشوهة العامة.
------------------------------------------
منذ أن تواصلت مع Java وJSP، كنت أتعامل باستمرار مع مشكلة الأحرف الصينية المشوشة في Java، والآن تم حلها بالكامل الآن.
1. أصل مشكلة جافا الصينية
تعتمد ملفات جافا الأساسية والفئوية على يونيكود، مما يجعل برامج جافا جيدة عبر الأنظمة الأساسية، ولكنها تسبب أيضًا بعض المشاكل مع الأحرف الصينية المشوهة. هناك سببان رئيسيان: مشكلة التعليمات البرمجية المشوهة الناتجة عن تجميع ملفات Java وJSP نفسها ومشكلة التعليمات البرمجية المشوهة الناتجة عن تفاعل برامج Java مع الوسائط الأخرى.
بادئ ذي بدء، من المحتمل أن تحتوي ملفات مصدر Java (بما في ذلك JSP) على اللغة الصينية، وتعتمد طريقة حفظ ملفات مصدر Java وJSP على تدفقات البايت. إذا تم تجميع Java وJSP في ملفات فئة، فإن طريقة التشفير المستخدمة تختلف عن الملف المصدر إذا كان الترميز غير متناسق، فستظهر أحرف مشوهة. بناءً على هذا النوع من التعليمات البرمجية المشوهة، يوصى بعدم كتابة اللغة الصينية في ملفات Java (لا يشارك جزء التعليق في التجميع، ولا يهم إذا كنت تكتب باللغة الصينية، فحاول التجميع يدويًا باستخدام المعلمة). - ترميز GBK أو - ترميز gb2312 لـ JSP، في رأس الملف إضافة <%@ page contentType="text/html;charset=GBK"%> أو <%@ page contentType="text/html;charset=gb2312"% > يمكنه حل هذا النوع من مشاكل التعليمات البرمجية المشوهة بشكل أساسي.
ستركز هذه المقالة على النوع الثاني من التعليمات البرمجية المشوهة، وهي التعليمات البرمجية المشوهة التي يتم إنشاؤها عندما تتفاعل برامج Java مع وسائط التخزين الأخرى. تعتمد العديد من وسائط التخزين، مثل قواعد البيانات والملفات والتدفقات وما إلى ذلك، على تدفقات البايت. عندما يتفاعل برنامج Java مع هذه الوسائط، سيحدث التحويل بين الأحرف (char) والبايت (byte)، على سبيل المثال، من الصفحة. تعرض البيانات المقدمة في نموذج التقديم أحرفًا مشوهة في برنامج Java.
إذا كانت طريقة التشفير المستخدمة في عملية التحويل أعلاه غير متوافقة مع التشفير الأصلي للبايتات، فمن المحتمل أن تظهر أحرف مشوهة.
2. الحل
بالنسبة إلى Tomcat المشهور، هناك حلان:
1) قم بتغيير D:Tomcatconfserver.xml وحدد تنسيق ترميز المتصفح على أنه "الصينية المبسطة":
الطريقة هي العثور على
<منفذ الموصل = "8080" maxThreads = "150" minSpareThreads = "25" maxSpareThreads = "75"
تمكينLookups = "خطأ" redirectPort = "8443" قبولCount = "100"
ConnectionTimeout = "20000" DisableUploadTimeout = "true" URIEncoding = 'GBK' />
العلامات، النص الغامق الذي أضفته.
يمكنك التحقق من نجاح التغيير على النحو التالي: قبل إجراء التغيير، في متصفح IE الخاص بك حيث تظهر الصفحة المشوهة، انقر فوق القائمة "عرض | ترميز" وستجد أنه تم تحديد "أوروبا الغربية (ISO)". بعد التغيير، انقر فوق القائمة "عرض | ترميز" وستجد أنه تم تحديد "الصينية المبسطة (GB2312)".
ب) تحديث برنامج Java الخاص بي كالتالي:
الطبقة العامة ThreeParams تمتد HttpServlet {
doGet الفراغ العام (طلب HttpServletRequest، استجابة HttpServletResponse)
يرمي ServletException، IOException {
Response.setContentType("text/html; charset=GBK");
...
}
}
الخطوط العريضة مطلوبة، وتتمثل وظيفتها في السماح للمتصفح بتحويل أحرف Unicode إلى أحرف GBK. بهذه الطريقة، يتم ضبط محتوى الصفحة ووضع العرض للمتصفح على GBK، لذلك لن تكون هناك أحرف مشوهة.
الحل الكامل للصينية تحت القط
أقوم بتطوير مشروع هذه الأيام، الخادم هو Tomcat، ونظام التشغيل عبارة عن مقالات وآراء، وقد أنجزته أخيرًا. لكن الذاكرة الجيدة ليست بجودة القلم السيئ، لذلك كتبتها لمنع نفسي من النسيان، وأيضاً لتكون مرجعاً جيداً لمن يواجه نفس المشكلة:
(1) صفحة JSP باللغة الصينية، ولكن عندما تنظر إليها تجدها مشوهة:
الحل هو استخدام <%@page language="java" contentType="text/html;charset=GBK" %> في ترميز صفحة JSP، وذلك بسبب مشكلة الترميز عند تحويل Jsp إلى ملف Java الافتراضي لبعض الخوادم هو ISO-8859-1، إذا تم إدخال اللغة الصينية مباشرة في JSP، فستكون هناك بالتأكيد مشكلة في معاملة Jsp لها على أنها ISO8859-1. يمكننا تأكيد ذلك من خلال النظر إلى ملف Java الوسيط الذي تم إنشاؤه بواسطة Jasper.
(2) عند استخدام كائن الطلب للحصول على رمز الحرف الصيني المقدم من العميل، ستظهر أحرف مشوهة:
الحل هو تكوين عامل التصفية، وهو مرشح Servicelet الكود كما يلي:
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
الطبقة العامة CharacterEncodingFilter تنفذ عامل التصفية {
تكوين FilterConfig الخاص؛
ترميز السلسلة الخاصة = "ISO8859_1"؛
تدمير الفراغ العام () {
System.out.println(config);
التكوين = فارغ؛
}
doFilter الفراغ العام (طلب ServletRequest، استجابة ServletResponse،
سلسلة FilterChain) تطرح IOException، ServletException {
request.setCharacterEncoding(encoding);
//chain.doFilter(request, Response);
chain.doFilter(request, Response);
}
init الفراغ العام (FilterConfig config) يلقي ServletException {
this.config = config;
String s = config.getInitParameter("encoding");
إذا (ق ! = فارغة) {
الترميز = الصورة؛
}
}
}
}
تكوين web.xml
<فلتر>
فلتر>
<تعيين عامل التصفية>
إذا كان هذا الموقف لا يزال يحدث في حالتك، فيمكنك النزول ومعرفة ما إذا كان لديك الموقف الرابع، وما إذا كانت البيانات المقدمة من النموذج الخاص بك يتم إرسالها باستخدام get ، ألق نظرة على الحل الرابع.
هناك أيضًا معالجة المعلومات التي تحتوي على أحرف صينية، ورمز المعالجة هو:
packagedbJavaBean;
تحويل ترميز الطبقة العامة
{
تحويل الترميز العام ()
{
//
}
سلسلة عامة إلىGb(سلسلة uniStr){
String gbStr = "";
إذا (uniStr == فارغة){
uniStr = "";
}
يحاول{
byte[] tempByte = uniStr.getBytes("ISO8859_1");
gbStr = new String(tempByte,"GB2312");
}
قبض (استثناء على سبيل المثال) {
}
إرجاع gbStr;
}
سلسلة عامة toUni(سلسلة gbStr){
String uniStr = "";
إذا (gbStr == فارغة){
gbStr = "";
}
يحاول{
byte[] tempByte = gbStr.getBytes("GB2312");
uniStr = new String(tempByte,"ISO8859_1");
}قبض(استثناء على سبيل المثال){
}
إرجاع uniStr;
}
}
يمكنك أيضًا إجراء تحويل مباشر، أولاً، تشفير السلسلة التي تم الحصول عليها باستخدام ISO-8859-1، ثم تخزين الترميز في مصفوفة بايت، ثم تحويل المصفوفة إلى كائن سلسلة.
String str=request.getParameter("girl");
بايت B[]=str.getBytes("ISO-8859-1");
Str=new String(B);
من خلال التحويل أعلاه، يمكن عرض أي معلومات مقدمة بشكل صحيح.
(3) عندما يستخدم طلب Formget request.getParameter("name") على الخادم، يتم إرجاع الأحرف المشوشة؛ ولا يعمل تعيين المرشح وفقًا لطريقة Tomcat، أو لا يعمل استخدام request.setCharacterEncoding("GBK"); إما أن المشكلة هي أنه فيما يتعلق بطريقة معالجة نقل المعلمات: إذا كنت تستخدم طريقة doGet (طلب HttpServletRequest، استجابة HttpServletResponse) في servlet، حتى لو كانت مكتوبة من قبل:
request.setCharacterEncoding("GBK");
Response.setContentType("text/html;charset=GBK");
إنه لا يعمل أيضًا، الصيني الذي عاد لا يزال مشوهًا! ! ! إذا قمت بتغيير هذه الوظيفة إلى doPost (طلب HttpServletRequest، استجابة HttpServletResponse) فسيكون كل شيء على ما يرام.
وبالمثل، عند استخدام صفحتين JSP لمعالجة إدخال النموذج، فإن السبب وراء إمكانية عرض اللغة الصينية هو استخدام طريقة النشر لتمريرها، وتغييرها إلى طريقة الحصول لا يزال غير فعال.
يمكن ملاحظة أنك بحاجة إلى الانتباه عند استخدام طريقة doGet() في servlet أو طريقة get في JSP. بعد كل شيء، يتضمن ذلك تمرير معلومات المعلمات من خلال المتصفح، وهو ما من المحتمل أن يسبب تعارضات أو عدم تطابق في مجموعات الأحرف شائعة الاستخدام.
الحل هو:
1) افتح ملف server.xml الخاص بـ Tomcat، وابحث عن الكتلة، وأضف السطر التالي:
URIEncoding=”GBK”
يجب أن يكون الكامل على النحو التالي:
<منفذ الموصل = "8080" maxThreads = "150" minSpareThreads = "25" maxSpareThreads = "75" EnableLookups = "false" redirectPort = "8443" AcceptCount = "100" debug = "0" ConnectionTimeout = "20000" DisableUploadTimeout = " صحيح" URIEncoding = "GBK"/>
2) أعد تشغيل القط، كل شيء على ما يرام.
يمكنك معرفة سبب حاجتك للانضمام من خلال دراسة الملف الموجود ضمن $TOMCAT_HOME/webapps/tomcat-docs/config/http.html. تجدر الإشارة إلى أنه إذا كنت تستخدم UTF-8 في هذا المكان، فستظهر أحرف مشوشة في Tomcat أثناء عملية الإرسال. إذا لم ينجح ذلك، قم بالتغيير إلى مجموعة أحرف أخرى.
(4) توجد أحرف صينية في صفحة JSP وأحرف صينية على الأزرار، ولكن عند عرض الصفحة من خلال الخادم تظهر أحرف مشوهة:
الحل هو: أولاً، لا ينبغي تضمين نص الرسالة المترجمة مباشرة في ملف JSP، ولكن يجب الحصول على النص من حزمة الموارد من خلال علامة
(5) الكود المكتوب في قاعدة البيانات مشوه:
الحل: قم بتكوين عامل التصفية، وهو مرشح Servicelet، وهو نفس الكود الموجود في المرة الثانية.
إذا كنت متصلاً مباشرة بقاعدة البيانات من خلال JDBC، فسيكون رمز التكوين كما يلي: jdbc:mysql://localhost:3306/workshopdb?useUnicode=true&characterEncoding=GBK سيضمن ذلك عدم تشويه التعليمات البرمجية الموجودة في قاعدة البيانات.
إذا قمت بالربط من خلال مصدر البيانات، فإن ما ورد أعلاه مناسب أيضًا إذا قمت بتكوينه بشكل صحيح، عند إدخال اللغة الصينية، سيكون هناك شيء واحد يجب ملاحظته وهو أنك تحتاج أيضًا إلى استخدام صفحة <%@ في الصفحة التي تعرض البيانات language="java" contentType="text/html;charset=GBK" %>هذا السطر من التعليمات البرمجية. تجدر الإشارة إلى أن بعض موظفي مكتب الاستقبال يستخدمون Dreamver لكتابة التعليمات البرمجية، ويقومون بتغييره إلى jsp الطلب، وتحتاج إلى إرساله، لأن هناك طريقتين لتقديم JSP: POST وGET، لكن الكود المرسل بواسطة هاتين الطريقتين لا يزال مختلفًا تمامًا من حيث التشفير
ملخص المقال:
نتحدث هنا بشكل أساسي عن حل مشكلة jsp المشوشة
1. المشكلة الأساسية في الشخصيات المشوهة.
PHPCE.CN، دليل التصميم
3. كيفية التعامل مع الأحرف المشوهة في النموذج الحصول على طريقة الإرسال.
إذا كنت تستخدم طريقة get لإرسال اللغة الصينية، فستظهر الصفحة التي تقبل المعلمات أيضًا مشوهة، ويعود سبب هذا الرمز المشوش أيضًا إلى تنسيق التشفير الداخلي لـ Tomcat iso8859-1. سيقوم Tomcat بتشفير الأحرف الصينية باستخدام طريقة التشفير الافتراضية get، iso8859-1، وإلحاقها بعنوان URL بعد التشفير، مما يؤدي إلى معلمات مشوهة / واستلامها من الصفحة.
حل:
أ. استخدم الطريقة الأولى في المثال أعلاه لفك تشفير الأحرف المستلمة ثم تحويلها.
B. يستخدم Get إرسال عنوان url، ويتم تنفيذ تشفير iso8859-1 قبل إدخال عنوان url. للتأثير على هذا التشفير، تحتاج إلى إضافة useBodyEncodingForURI="true" إلى عقدة الرابط في server.xml
يمكن لتكوين السمة التحكم في طريقة ترميز الأحرف الصينية لطريقة get. تتحكم السمة أعلاه في عملية الإرسال المراد تشفيرها باستخدام تنسيق التشفير الذي تم تعيينه بواسطة request.setCharacterEncoding("UTF-8"). لذلك، يتم ترميزه تلقائيًا كـ utf-8، ويمكن لصفحة القبول قبوله بشكل طبيعي. لكنني أعتقد أن عملية التشفير الحقيقية هي أنه يتعين على Tomcat تغيير D:Tomcatconfserver.xml وتحديد تنسيق ترميز المتصفح على أنه "الصينية المبسطة":
<منفذ الموصل = "8080"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
تمكينLookups = "خطأ" redirectPort = "8443" قبولCount = "100"
تصحيح = "0" ConnectionTimeout = "20000" useBodyEncodingForURI = "صحيح"
DisableUploadTimeout="true" URIEncoding="UTF-8"/> PHPCE.CN، تم ترميز URIEncoding="UTF-8" المعين في دليل التصميم مرة أخرى، ولكن بما أنه تم ترميزه كـ utf-8، فلن يتم ترميزه لقد تغير شيء مشفرة مرة أخرى. إذا تم الحصول على التشفير من عنوان URL، فسيتم فك تشفير الصفحة المتلقية وفقًا لـ URIEncoding = "UTF-8".
يمكنك معرفة سبب حاجتك إلى إضافته من خلال دراسة الملف الموجود ضمن $TOMCAT_HOME/webapps/tomcat-docs/config/http.html ويمكنك التحقق من نجاح التغيير على النحو التالي: قبل إجراء التغيير، تظهر صفحة مشوهة سيظهر على صفحتك في متصفح IE، انقر فوق القائمة "عرض | ترميز" وستجد أنه تم تحديد "أوروبا الغربية (ISO)". بعد التغيير، انقر فوق القائمة "عرض | ترميز" وستجد أنه تم تحديد "الصينية المبسطة (GB2312)".
4. حل الأحرف المشوهة عند تحميل الملفات، عند تحميل الملفات، تكون إعدادات النموذج enctype = "multipart/form-data". بهذه الطريقة يتم تقديم الملفات بطريقة متدفقة. إذا كنت تستخدم مكون التحميل الخاص بـ Apach، فستجد الكثير من التعليمات البرمجية المشوهة. وذلك لأن ملف Commons-fileupload.jar المبكر لـ Apach به خطأ، وتم إخراج الأحرف الصينية وفك تشفيرها، نظرًا لإرسال هذه الطريقة، يستخدم التشفير تلقائيًا تنسيق التشفير الافتراضي لـ Tomcat iso-8859-1. لكن مشكلة الأحرف المشوهة هي: أن الرموز الخاصة مثل النقاط والفواصل وما إلى ذلك تصبح أحرفًا مشوهة. إذا كان عدد الأحرف الصينية رقمًا فرديًا، فستظهر أحرف مشوهة، وإذا كان هناك رقم زوجي، فسيكون التحليل طبيعيًا .
الحل: قم بتنزيل commons-fileupload-1.1.1.jar وقد نجح هذا الإصدار من الجرة في حل هذه الأخطاء.
ومع ذلك، عند استخراج المحتوى، لا تزال بحاجة إلى تحويل ترميز الأحرف المستخرجة من iso8859-1 إلى utf-8. يمكن الحصول على جميع الحروف والشخصيات الصينية العادية.
5. كود جافا فيما يتعلق بطلب عنوان url، وتلقي المعلمات المشوهة
يعتمد تنسيق ترميز عنوان url على URIEncoding = "UTF-8" المذكور أعلاه. إذا تم تعيين تنسيق التشفير هذا، فهذا يعني أنه يجب تشفير جميع معلمات الأحرف الصينية لعنوان URL. بخلاف ذلك، فإن قيم معلمات الأحرف الصينية التي تم الحصول عليها كلها مشوهة، مثل الرابط Response.sendDerect ("/a.jsp?name=Zhang Dawei")؛ ويتم استخدامه مباشرة في a.jsp
PHPCE.CN، دليل التصميم
String name = request.getParameter("name"); ما تحصل عليه هو أحرف مشوهة. لأنه يشترط أن يكون utf-8 فيجب كتابة إعادة التوجيه هكذا:
Response.sendDerect("/a.jsp?name=URLEncode.encode("Zhang Dawei"،"utf-8"); فقط.
ماذا سيحدث إذا لم يتم تعيين هذه المعلمة URIEncoding = "UTF-8"؟ إذا لم يتم تعيينها، فسيتم استخدام تنسيق الترميز الافتراضي iso8859-1. تظهر المشكلة مرة أخرى. المشكلة الأولى هي أنه إذا كان عدد قيم المعلمات رقمًا فرديًا، فيمكن تحليله بشكل طبيعي. وإذا كان رقمًا زوجيًا، فسيتم تشويه الحرف النهائي. أيضًا، إذا كان الحرف الأخير باللغة الإنجليزية، فيمكن تحليله بشكل طبيعي، لكن علامات الترقيم الصينية لا تزال مشوهة. كوسيلة، إذا لم تكن هناك علامات ترقيم صينية في المعلمات الخاصة بك، فيمكنك إضافة رمز إنجليزي في نهاية قيمة المعلمة لحل المشكلة المشوهة، ثم إزالة الرمز الأخير بعد الحصول على المعلمات. يمكن أيضًا كشطها أو استخدامها.
6. فيما يتعلق بطلب عنوان url، سيتحكم كود البرنامج النصي أيضًا في إعادة توجيه الصفحة إذا كانت المعلمات المستلمة مشوهة، وسيشمل أيضًا المعلمات المرفقة ويحلل المعلمات في الصفحة المتلقية. إذا لم تقم معلمة الأحرف الصينية بإجراء معالجة الترميز المحددة بواسطة URIEncoding="UTF-8"، فستكون الأحرف الصينية التي تستقبلها الصفحة المتلقية مشوهة أيضًا. تعد معالجة البرنامج النصي وترميزه أمرًا مزعجًا. يجب أن يكون لديك ملف مطابق يتوافق مع برنامج الترميز النصي، ثم قم باستدعاء الطريقة الموجودة في البرنامج النصي لترميز الأحرف الصينية.
7. فيما يتعلق بمشكلة jsp المشوهة المفتوحة في MyEclipse بالنسبة لمشروع موجود، قد يكون تنسيق تخزين ملف Jsp هو utf-8. إذا تم تثبيت Eclipse حديثًا، فإن تنسيق التشفير المستخدم افتراضيًا للفتح هو iso8859-1. ولذلك، فإن الأحرف الصينية في jsp مشوهة. من السهل نسبيًا حل هذا الرمز المشوه، ما عليك سوى الانتقال إلى تفضيلات Eclipse3.1 والعثور على General->edidor، وتعيين التشفير الافتتاحي لملفك على utf-8. سيتم إعادة فتح Eclipse تلقائيًا بتنسيق الترميز الجديد. يمكن عرض الأحرف الصينية بشكل طبيعي.
8. حول التعليمات البرمجية المشوهة عند فتح صفحة HTML في Eclipse نظرًا لأن معظم الصفحات يتم إنتاجها بواسطة Dreamweaver، فإن تنسيق تخزينها يختلف عن التعرف على Eclipse.
بشكل عام، في هذه الحالة، قم بإنشاء ملف jsp جديد في Eclipse، وانسخ محتوى الصفحة مباشرةً من Dreamweaver وألصقه في ملف jsp.
PHPCE.CN، دليل التصميم
تعد مشكلة التعليمات البرمجية المشوهة هذه أبسط مشكلة في التعليمات البرمجية المشوهة. عادة سوف تظهر جديدة. إنه رمز مشوه ناتج عن ترميز الصفحة غير المتناسق.
<%@page language="java" pageEncoding="UTF-8"%>
<%@ page contentType="text/html;charset=iso8859-1"%>
<أتش تي أم أل>
<الرأس>