เนื่องจากฟิลด์ Oracle ที่ใช้โดยอินเทอร์เฟซเป็นจำนวนไบต์คงที่และสตริงที่ส่งผ่านนั้นคาดว่าจะมีขนาดใหญ่กว่าจำนวนไบต์ทั้งหมดในฟิลด์ฐานข้อมูลจากนั้นสตริงที่เล็กกว่าจำนวนไบต์ในฐานข้อมูลจะถูกสกัดกั้น
ฉันอ้างถึงตัวอย่างบนอินเทอร์เน็ตและเพียงแค่โทรเรียกซ้ำเนื่องจากความยาวไบต์ของอักขระที่สกัดกั้นจะต้องมีขนาดเล็กกว่าความยาวไบต์ของฐานข้อมูลนั่นคือถ้าอักขระตัวสุดท้ายเป็นอักขระภาษาจีนคุณสามารถลบการสกัดกั้นไปข้างหน้าได้
/*** พิจารณาว่าสตริงที่ส่งผ่านนั้นมากกว่าไบต์ที่ระบุหรือไม่ หากมากกว่าการเรียกซ้ำ * จนกว่าจะน้อยกว่าหมายเลขไบต์ที่ระบุให้แน่ใจว่าได้ระบุการเข้ารหัสอักขระเนื่องจากการเข้ารหัสอักขระของแต่ละระบบนั้นแตกต่างกันและจำนวนไบต์ก็แตกต่างกัน num) พ่นข้อยกเว้น {int changdu = s.getBytes ("UTF-8"). ความยาว; if (changdu> num) {s = s.substring (0, s.length () - 1); s = idgui (s, num); } return s; -คำถามสัมภาษณ์ Java:
เขียนฟังก์ชั่นที่สกัดกั้นสตริงอินพุตเป็นสตริงและไบต์และเอาต์พุตเป็นสตริงที่ถูกดักจับโดยไบต์ อย่างไรก็ตามคุณต้องตรวจสอบให้แน่ใจว่าตัวละครจีนจะไม่ถูกตัดออกครึ่งหนึ่ง ตัวอย่างเช่น "I ABC" 4 ควรถูกตัดออกเป็น "I AB", ป้อน "I ABC Chinese Def" และ 6 ควรได้รับการส่งออกเป็น "I ABC" แทนที่จะเป็น "I ABC+ จีนครึ่ง"
ปัจจุบันภาษายอดนิยมมากมายเช่น C# และ Java ใช้การเข้ารหัส Unicode 16 (UCS2) ในการเข้ารหัสนี้อักขระทั้งหมดเป็นอักขระสองตัว ดังนั้นหากสตริงที่ถูกดักจับจะผสมกับภาษาจีนอังกฤษและตัวเลขปัญหาจะเกิดขึ้นเช่นสตริงต่อไปนี้:
String S = "A Plus B เท่ากับ C ถ้า A ฯลฯ 1 และ B เท่ากับ 2 แล้ว C ฯลฯ 3";
สตริงด้านบนมีทั้งอักขระจีนอักขระภาษาอังกฤษและตัวเลข หากคุณต้องการสกัดกั้นอักขระของ 6 ไบต์แรกควรเป็น "A Plus B ฯลฯ " แต่ถ้าคุณใช้วิธีการย่อยเพื่อสกัดกั้นอักขระ 6 ตัวแรกมันจะกลายเป็น "A Plus B เท่ากับ C" เหตุผลสำหรับปัญหานี้คือวิธีการย่อยถือว่าอักขระจีนสองไบต์เป็นอักขระไบต์หนึ่งตัว (อักขระ UCS2)
จำนวนไบต์ที่ถูกครอบครองโดยตัวอักษรภาษาอังกฤษและตัวอักษรจีนในรูปแบบการเข้ารหัสที่แตกต่างกันก็แตกต่างกันเช่นกัน เราสามารถใช้ตัวอย่างต่อไปนี้เพื่อดูจำนวนจดหมายภาษาอังกฤษและตัวละครจีนครอบครองในรูปแบบการเข้ารหัสทั่วไป
นำเข้า java.io.unsupportencodingexception; คลาสสาธารณะ encodetest { / ** * พิมพ์จำนวนไบต์และการเข้ารหัสชื่อของสตริงภายใต้การเข้ารหัสที่ระบุไปยังคอนโซล * * @param s * สตริง * @param encodingName * รูปแบบการเข้ารหัส * / โมฆะสาธารณะ printbyTelength (สตริง S, String encodingName) ลอง {system.out.print (s.getBytes (encodingName) .length); } catch (unsupportencodingexception e) {e.printstacktrace (); } system.out.println ("; การเข้ารหัส:" + encodingName); } โมฆะคงที่สาธารณะหลัก (สตริง [] 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 เป็นตัวอย่างในการตอบ
เราไม่สามารถใช้ substring (int entalingindex โดยตรง, int endindex) วิธีการของคลาสสตริงเพราะมันถูกดักจับโดยอักขระ ทั้ง 'ฉัน' และ 'z' ได้รับการปฏิบัติเหมือนตัวละครตัวเดียวและความยาวทั้งสองคือ 1 อันที่จริงตราบใดที่เราสามารถแยกแยะระหว่างตัวละครจีนและตัวอักษรภาษาอังกฤษปัญหานี้จะได้รับการแก้ไขได้อย่างง่ายดาย ความแตกต่างคือตัวละครจีนเป็นสองไบต์และตัวอักษรภาษาอังกฤษเป็นหนึ่งไบต์
แพ็คเกจ com.newyulong.iptv.billing.ftpupload; นำเข้า java.io.unsupportencodingexception; คลาสสาธารณะ cutstring { / *** กำหนดว่ามันเป็นตัวละครจีน** @param c* ตัวละคร* @return ความจริง บูลีนแบบคงที่คือ Chinesechar (Char C) พ่นไม่ได้รับการตอบรับ {// ถ้าจำนวนไบต์มากกว่า 1 มันเป็นตัวละครจีน // วิธีนี้ไม่เข้มงวดมากในการแยกจดหมายภาษาอังกฤษจากตัวละครจีน แต่ในคำถามนี้การตัดสินนี้เพียงพอที่จะกลับมาสตริง } / *** สตริงสกัดกั้นโดยไบต์** @param สตริงต้นฉบับ* @param จำนวน* ตัวเลขที่สกัดกั้น* @return สตริงที่สกัดกั้น* @throws unsupportencodingexception* ใช้รูปแบบการเข้ารหัสที่ java ไม่รองรับ* / สตริงแบบคงที่ null &&! "". เท่ากับ (orignal)) {// แปลงสตริงต้นฉบับเป็นรูปแบบการเข้ารหัส GBK orignal = สตริงใหม่ (orignal.getBytes (), "UTF-8"); // // system.out.println (orignal); //system.out.println(orignal.getBytes().length); // จำนวนไบต์ที่จะถูกดักมีมากกว่า 0 และน้อยกว่าจำนวนไบต์ของสตริงต้นฉบับถ้า (นับ> 0 && นับ <orignal.getBytes ("UTF-8"). ความยาว) {StringBuffer buff = new StringBuffer (); ถ่าน C; สำหรับ (int i = 0; i <count; i ++) {system.out.println (นับ); C = Original.charat (i); buff.append (c); if (cutstring.ischinesechar (c)) {// เมื่อพบตัวอักษรจีนให้ตัดจำนวนไบต์ทั้งหมดโดย 1 -นับ; }} // system.out.println (สตริงใหม่ (buff.toString (). getBytes ("GBK"), "UTF-8")); ส่งคืนสตริงใหม่ (buff.toString (). getBytes (), "UTF-8"); }} ส่งคืนต้นฉบับ; } / *** สตริงการสกัดกั้นโดยไบต์** @param สตริงต้นฉบับ* @param จำนวน* ตัวเลขการสกัดกั้น* @return สตริงที่สกัดกั้น* @throws unsupportencodingexception* ใช้รูปแบบการเข้ารหัสที่ java ไม่สนับสนุน* / public String gsubstring (สตริงต้นฉบับ ! = null &&! "". เท่ากับ (orignal)) {// แปลงสตริงต้นฉบับเป็นรูปแบบการเข้ารหัส gbk orignal = สตริงใหม่ (orignal.getBytes (), "gbk"); // จำนวนไบต์ที่จะถูกสกัดกั้นมากกว่า 0 และน้อยกว่าจำนวนไบต์ของสตริงต้นฉบับถ้า (นับ> 0 && นับ <orignal.getBytes ("GBK"). ความยาว) {StringBuffer buff = new StringBuffer (); ถ่าน C; สำหรับ (int i = 0; i <count; i ++) {c = orignal.charat (i); buff.append (c); if (cutstring.ischinesechar (c)) {// เมื่อพบตัวอักษรจีนให้ตัดจำนวนไบต์ทั้งหมดเป็น 1 -นับ; }} return buff.toString (); }} ส่งคืนต้นฉบับ; } / *** พิจารณาว่าสตริงที่ผ่านนั้นมากกว่าไบต์ที่ระบุหรือไม่ถ้ามันมากกว่าการเรียกซ้ำ* จนกว่าจะน้อยกว่าไบต์ที่ระบุ* @param s* สตริงต้นฉบับ* @param num* ผ่านเพื่อระบุจำนวนไบต์* @return สตริง if (changdu> num) {s = s.substring (0, s.length () - 1); s = idgui (s, num); } return s; } โมฆะคงที่สาธารณะหลัก (สตริง [] args) พ่นข้อยกเว้น {// สตริงต้นฉบับ S = "i zwr รักคุณ java"; System.out.println ("สตริงดิบ:" + s + ": จำนวนไบต์คือ:" + s.getBytes (). ความยาว); /* system.out.println ("สกัดกั้น 1 หลักแรก:" + cutstring.substring (s, 1)); System.out.println ("สกัดกั้น 2 หลักแรก:" + cutstring.substring (s, 2)); System.out.println ("สกัดกั้น 4 บิตแรก:" + cutstring.substring (s, 4)); *///system.out.println("intercept 12 บิตแรก: " + cutstring.substring (s, 12)); System.out.println ("สกัดกั้น 12 ไบต์แรก:" + cutstring.idgui (s, 11)); -ทางออกข้างต้นสำหรับสตริงการสกัดกั้น Java ด้วยอักขระจีนโดยไบต์ (แนะนำ) คือเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่ามันจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น