نظرًا لأن حقل Oracle المستخدمة في الواجهة هو عدد ثابت من البايتات ، ويقدر أن السلسلة التي تم تمريرها أكبر من إجمالي عدد البايتات في حقل قاعدة البيانات ، ثم يتم اعتراض سلسلة أصغر من عدد البايتات في قاعدة البيانات.
أشير إلى الأمثلة على الإنترنت وأكمل فقط مكالمة متكررة ، لأن طول البايت للشخصية المعتادة يجب أن يكون أصغر من طول البايت لقاعدة البيانات ، أي إذا كان الحرف الأخير هو حرف صيني ، فيمكنك فقط إزالة التقاطع للأمام.
/*** حدد ما إذا كانت السلسلة التي تم تمريرها أكبر من البايت المحدد. إذا كانت أكبر من المكالمة العودية * حتى تكون أقل من رقم البايت المحدد ، فتأكد من تحديد تشفير الأحرف ، لأن ترميز الحرف لكل نظام مختلف ويختلف عدد البايتات أيضًا * @param s * string string undertedexpisex (string string string */ int string string */ int string string */ int string string */ int string string */ NUM) يلقي الاستثناء {int changdu = s.getBytes ("utf-8"). الطول ؛ if (changdu> num) {s = S.SubString (0 ، s.length () - 1) ؛ s = idgui (s ، num) ؛ } العودة s ؛ }أسئلة مقابلة جافا:
اكتب وظيفة تعترض السلاسل والمدخلات كسلسلة وبايت ، والمخرجات كسلسلة اعتراضها بايت. ومع ذلك ، يجب عليك التأكد من عدم قطع الأحرف الصينية نصف. على سبيل المثال ، يجب أن يتم قطع "I ABC" 4 على أنها "I ab" ، وإدخال "I ABC Chinese DEF" ، و 6 يجب أن يتم إخراجها كـ "I ABC" بدلاً من "I ABC+ HAND الصيني".
حاليًا ، تستخدم العديد من اللغات الشائعة ، مثل C# و Java ، ترميز Unicode 16 (UCS2). في هذا الترميز ، جميع الأحرف هي حرفين. لذلك ، إذا تم خلط السلسلة المراد اعتراضها مع الصينية والإنجليزية والأرقام ، فسوف تنشأ المشكلات ، مثل السلسلة التالية:
السلسلة s = "a plus b يساوي C ، إذا كان A.
تحتوي السلسلة أعلاه على كل من الأحرف الصينية والأحرف والأرقام الإنجليزية. إذا كنت ترغب في اعتراض أحرف البايتات الستة الأولى ، فيجب أن تكون "زائد B ، إلخ" ، ولكن إذا كنت تستخدم طريقة السلسلة الفرعية لاعتراض الأحرف الستة الأولى ، فسيصبح "A Plus B Equals C". سبب هذه المشكلة هو أن طريقة السلسلة الفرعية تعامل الأحرف الصينية ذات البايت المزدوجة كحرف بايت واحد (أحرف UCS2).
يختلف عدد البايتات التي تشغلها الحروف الإنجليزية والأحرف الصينية بتنسيقات تشفير مختلفة أيضًا. يمكننا استخدام الأمثلة التالية لمعرفة عدد البايتات التي تشغلها حرفًا باللغة الإنجليزية وشخصية صينية في بعض تنسيقات الترميز الشائعة.
استيراد java.io.unsupportedencodingException ؛ الطبقة العامة encodeTest { / ** * طباعة عدد البايتات واسم الترميز للسلسلة تحت الترميز المحدد إلى وحدة التحكم * * param s * string * param encodingName * تنسيق الترميز * / public static void printbytelength (سلسلة s ، string chargename) {system.print.print. حاول {system.out.print (S.GetBytes (encodingName) .Length) ؛ } catch (UnsupportedEncodingException e) {E.PrintStackTrace () ؛ } system.out.println ("؛ التشفير:" + encodingName) ؛ } public static void main (string [] args) {string en = "a" ؛ سلسلة ch = "الناس" ؛ // احسب عدد بايت خطاب إنجليزي ضمن نظام الترميز المختلفة. EncodeTest.printbyTeLength (EN ، "GB2312") ؛ EncodeTest.printbytelength (en ، "gbk") ؛ EncodeTest.printbyTeLength (EN ، "GB18030") ؛ EncodeTest.printbytelength (en ، "ISO-8859-1") ؛ EncodeTest.printbyTeLength (EN ، "UTF-8") ؛ EncodeTest.printbyTeLength (EN ، "UTF-16") ؛ EncodeTest.printbyTeLength (EN ، "UTF-16BE") ؛ EncodeTest.printbyTeLength (en ، "utf-16le") ؛ system.out.println () ؛ // احسب عدد بايت شخصية صينية تحت نظام الترميز المختلفة. EncodeTest.printbyTeLength (CH ، "GB2312") ؛ EncodeTest.printbytelength (CH ، "GBK") ؛ EncodeTest.printbyTelength (CH ، "GB18030") ؛ EncodeTest.printbyTelength (CH ، "ISO-8859-1") ؛ EncodeTest.printbyTeLength (CH ، "UTF-8") ؛ EncodeTest.printbyTeLength (CH ، "UTF-16") ؛ EncodeTest.printbyTeLength (CH ، "UTF-16BE") ؛ EncodeTest.printbyTeLength (CH ، "UTF-16LE") ؛ }}نتائج التشغيل كما يلي:
1. الحروف الإنجليزية: أ
2. عدد البايتات: 1 ؛ الترميز: GB2312
3. عدد البايتات: 1 ؛ الترميز: GBK
4. عدد البايتات: 1 ؛ الترميز: GB18030
5. عدد البايتات: 1 ؛ الترميز: ISO-8859-1
6. عدد البايتات: 1 ؛ الترميز: UTF-8
7. عدد البايتات: 4 ؛ الترميز: UTF-16
8. عدد البايتات: 2 ؛ الترميز: UTF-16BE
9. عدد البايتات: 2 ؛ الترميز: UTF-16LE
10. الشخصيات الصينية: الناس
11. عدد البايتات: 2 ؛ الترميز: GB2312
12. عدد البايتات: 2 ؛ الترميز: GBK
13. عدد البايتات: 2 ؛ الترميز: GB18030
14. عدد البايتات: 1 ؛ الترميز: ISO-8859-1
15. عدد البايتات: 3 ؛ الترميز: UTF-8
16. عدد البايتات: 4 ؛ الترميز: UTF-16
17. عدد البايتات: 2 ؛ الترميز: UTF-16BE
18. عدد البايتات: 2 ؛ الترميز: UTF-16LE
UTF-16BE و UTF-16LE هي عضوان في عائلة Unicode ترميز. يحدد معيار Unicode ثلاثة تنسيقات ترميز: UTF-8 و UTF-16 و UTF-32 ، ولديه سبعة مخططات ترميز: UTF-8 ، UTF-16 ، UTF-16BE ، UTF-16LE ، UTF-32 ، UTF-32BE ، و UTF-32LE. مخطط الترميز المستخدمة من قبل Java هو UTF-16BE. من النتائج الجارية للمثال أعلاه ، يمكننا أن نرى أن تنسيقات الترميز الثلاثة لـ GB2312 و GBK و GB18030 يمكنها جميع متطلبات السؤال. دعنا نأخذ ترميز GBK كمثال للإجابة.
لا يمكننا استخدام طريقة Subctring (int bathindex ، int endindex) لفئة السلسلة لأنه يتم اعتراضه بواسطة الحرف. يتم التعامل مع كل من "أنا" و "Z" كحرف واحد ، والطول هو 1. في الواقع ، طالما يمكننا التمييز بين الأحرف الصينية والرسائل الإنجليزية ، سيتم حل هذه المشكلة بسهولة. الفرق هو أن الشخصيات الصينية هما بايتان والحروف الإنجليزية هي بايت واحد.
حزمة com.newyulong.iptv.billing.ftpupload ؛ استيراد java.io.unsupportedencodingexception ؛ cutString الفئة العامة { /*** حدد ما إذا كان هناك حرف صيني** @param c* المنطق الثابت العام هو chinesechar (char c) يلقي UnduportedEncodingException {// إذا كان عدد البايتات أكبر من 1 ، فهو شخصية صينية // هذه الطريقة ليست صارمة للغاية في التمييز بين الحروف الإنجليزية من الأحرف الصينية ، ولكن في هذا السؤال ، يكفي العودة إلى السلسلة. } / *** intercept string by byte** param string Original* @param count* الأرقام المعتادة* @RETURN المعتدل السلسلة* throws غير مدعوم ! = null &&! " //system.out.println(orignal.getBytes().length) ؛ // عدد البايتات المراد اعتراضها أكبر من 0 وأقل من عدد بايت السلسلة الأصلية إذا (count> 0 && count <orignal.getBytes ("UTF-8"). الطول) {StringBuffer Buff = new StringBuffer () ؛ شار ج. لـ (int i = 0 ؛ i <count ؛ i ++) {system.out.println (count) ؛ C = Original.charat (i) ؛ Buff.Append (c) ؛ if (cutString.ischinesechar (c)) {// عند مواجهة الأحرف الصينية ، قم بقطع العدد الإجمالي للبايت بايت بمقدار 1 -count ؛ }} // system.out.println (سلسلة جديدة (Buff.ToString (). getBytes ("GBK") ، "UTF-8")) ؛ إرجاع سلسلة جديدة (Buff.ToString (). getBytes () ، "UTF-8") ؛ }} إرجاع الأصل ؛ } / *** intercept string by byte** param string Original* @param count* intercept just* @RETURN string* therwes athrows unsupportedencodingexception* تنسيقات الترميز المستخدمة التي لا تدعمها java* // ! = null &&! " // يكون عدد البايتات المراد اعتراضها أكبر من 0 وأقل من عدد بايت السلسلة الأصلية إذا (count> 0 && count <orignal.getBytes ("gbk"). الطول) {StringBuffer Buff = new StringBuffer () ؛ شار ج. لـ (int i = 0 ؛ i <count ؛ i ++) {c = orignal.charat (i) ؛ Buff.Append (c) ؛ if (cutString.ischinesechar (c)) {// عند مواجهة الأحرف الصينية ، قطع العدد الإجمالي للبايت إلى 1 -count ؛ }} return buff.toString () ؛ }} إرجاع الأصل ؛ } / *** حدد ما إذا كانت السلسلة التي تم تمريرها أكبر من البايتات المحددة ، إذا كانت أكبر من المكالمة المتكررة* حتى تكون أقل من البايتات المحددة* param s* السلسلة الأصلية* param num* تمريرها لتحديد عدد bytes* @string string* / string idgui العامة (السلسلة S ، int num) {int changdu ؛ if (changdu> num) {s = S.SubString (0 ، s.length () - 1) ؛ s = idgui (s ، num) ؛ } العودة s ؛ } public static void main (string [] args) يرمي الاستثناء {// string string s = "i zwr love you java" ؛ System.out.println ("raw string:" + s + ": عدد البايتات هو:" + s.getBytes (). الطول) ؛ /* system.out.println ("اعتراض أول رقم واحد:" + cutString.SubString (s ، 1)) ؛ System.out.println ("اعتراض أول 2 رقمين:" + cutString.SubString (s ، 2)) ؛ System.out.println ("اعتراض أول 4 بت:" + cutString.SubString (s ، 4)) ؛ *///system.out.println("interception أول 12 بت: " + cutString.SubString (s ، 12)) ؛ System.out.println ("اعتراض أول 12 بايت:" + cutString.idgui (s ، 11)) ؛ }}الحل أعلاه لسلاسل اعتراض Java مع الأحرف الصينية بواسطة Bytes (الموصى بها) هو كل المحتوى الذي أشاركه معك. آمل أن يعطيك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.