لقد قمت بالتطوير بناءً على Eclipse3.2+j2ee5.0 +tomcat5.09+mysql5.0
أولاً، يمكن حل البيانات الصينية المشوهة في النموذج POST.
يمكن تصفية هذا النوع من البيانات الصينية في الوقت الفعلي من خلال المرشحات. رمز المرشحات هو كما يلي:
مرشحات الحزمة
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;
import javax.servlet.UnavailableException؛
فئة عامة SetCharacterEncodingFilter تنفذ عامل التصفية ...{
ترميز السلسلة المحمية = فارغ؛
protected FilterConfig filterConfig = null;
تجاهل منطقي محمي = صحيح
تدمير الفراغ العام () ...{
this.encoding = null;
this.filterConfig = null;
}
doFilter الفراغ العام (طلب ServletRequest، استجابة ServletResponse،
سلسلة FilterChain)
throws IOException, ServletException ...{
// حدد بشكل مشروط وتعيين ترميز الأحرف المراد استخدامه
إذا (تجاهل || (request.getCharacterEncoding() == null)) ...{
ترميز السلسلة = SelectEncoding(request);
إذا (الترميز! = فارغ)
request.setCharacterEncoding(encoding);
}
// تمرير التحكم إلى الفلتر التالي
chain.doFilter(request, Response);
}
public void init(FilterConfig filterConfig) throws ServletException ...{
this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter("encoding");
قيمة السلسلة = filterConfig.getInitParameter("ignore");
إذا (القيمة == فارغة)
this.ignore = true;
وإلا إذا (value.equalsIgnoreCase("true"))
this.ignore = true;
وإلا إذا (value.equalsIgnoreCase("yes"))
this.ignore = true;
آخر
this.ignore = false;
}
protected String SelectEncoding(ServletRequest request) ...{
العودة (هذا. الترميز)؛
}
}
تكوين المرشحات (التكوين web.xml):
<تصفية>
<اسم المرشح>تعيين ترميز الأحرف</اسم عامل التصفية>
<فئة التصفية>filters.SetCharacterEncodingFilter</filter-class>
<البداية-المعلمة>
<اسم المعلمة>الترميز</اسم المعلمة>
<قيمة المعلمة>GBK</قيمة المعلمة>
</init-param>
</مرشح>
<تصفية-تعيين>
<اسم المرشح>تعيين ترميز الأحرف</اسم عامل التصفية>
<نمط عنوان URL>/*</نمط عنوان url>
</ رسم خرائط التصفية>
2. يتم أخذ مشكلة الأحرف المشوهة عند تخزين البيانات الصينية في قاعدة البيانات
كمثال في mysql. ما عليك سوى إعادة كتابة سلسلة الاتصال:
jdbc:mysql://localhost:3306/workshopdb?useUnicode=true&characterEncoding=GBK
3. مشاكل في تمرير المعلمات من خلال عنوان URL وتحديد أسماء الملفات الصينية
أعراض المشكلة: 1. تمرير المعلمات من خلال عنوان URL، على سبيل المثال:
http://localhost:81/crjy/admin/articlelist.jsp?levelId=64&levelName =Student. بناء الحزب
القيمة التي تم الحصول عليها من خلال request.getParameter("levleName") هي Ranma.
2. التعرف على أسماء الملفات الصينية، على سبيل المثال:
<img src="./pic/Sichuan Map.jpg"> لا يمكن عرض الصور.
الحل:
1. إذا كنت تريد حل المشكلة الأولى فقط، فالأمر بسيط للغاية، فقط سطرين من التعليمات البرمجية:
String role=request.getParameter("chara");
role=new String(role.getBytes("ISO-8859-1"),"GB2312");
println(role);
لأن خادم Tomcat يستخدم مجموعة أحرف ISO-8859-1 افتراضيًا. ولكن هذا يمكن أن يحل المشكلة الأولى فقط وليس مشكلة اسم الملف الصيني.
2. قم بحل المشكلتين معًا. قم بتعديل server.xml، وابحث عن العبارة التالية وأضف URIEncoding = "GB18030"، بحيث يتم حل المشكلتين معًا ( لا يوجد دور مطلوب) =new String(role.getBytes("ISO-8859-1"),"GB2312"); التحويل، المعلمات التي تم الحصول عليها هي صينية عادية)
<Connector AcceptCount="100" ConnectionTimeout="20000" debug=" 0" DisableUploadTimeout = "true" EnableLookups = "false" maxSpareThreads = "75" maxThreads = "150" minSpareThreads = "25" port = "81" redirectPort = "8443"/>
بالإضافة إلى ذلك، تقدم العديد من المقالات أنه يمكنك إضافة URIEncoding = "UTF-8"، والذي يمكنه حل مشكلة اسم الملف الصيني، ولكن عندما تحصل على المعلمات التي تم تمريرها بواسطة عنوان url من خلال String role=request.getParameter("chara"); ، تحصل على ترميز UTF-8، ويجب تحويله إلى GB2312 وهو أمر مزعج.
ما ورد أعلاه هو ملخص لاستخدامي وآمل أن يتمكن الجميع من تقديم آراء قيمة.
http://blog.csdn.net/lijiuu/archive/2007/02/25/1514354.aspx