Karena bidang Oracle yang digunakan oleh antarmuka adalah jumlah byte yang tetap, dan string yang dilewati diperkirakan lebih besar dari jumlah total byte dalam bidang database, kemudian string yang lebih kecil dari jumlah byte dalam database dicegat.
Saya merujuk pada contoh -contoh di internet dan hanya menyelesaikan panggilan rekursif, karena panjang byte dari karakter yang dicegat harus lebih kecil dari panjang byte basis data, yaitu, jika karakter terakhir adalah karakter Cina, maka Anda hanya dapat menghapus intersep ke depan.
/*** Tentukan apakah string yang diteruskan lebih besar dari byte yang ditentukan. Jika lebih besar dari panggilan rekursif * hingga kurang dari nomor byte yang ditentukan, pastikan untuk menentukan pengkodean karakter, karena pengkodean karakter masing -masing sistem berbeda dan jumlah byte juga berbeda * @param s * string @param @param, untuk menentukan jumlah byte * @return string yang disantap public * num) melempar pengecualian {int changdu = s.getbytes ("UTF-8"). Panjang; if (changdu> num) {s = s.substring (0, s.length () - 1); s = idgui (s, num); } return s; }Pertanyaan Wawancara Java:
Tulis fungsi yang mencegat string, input sebagai string dan byte, dan output sebagai string yang dicegat oleh byte. Namun, Anda harus memastikan bahwa karakter Cina tidak terputus. Misalnya, "I ABC" 4 harus dipotong sebagai "I AB", masukkan "I ABC Chinese Def", dan 6 harus output sebagai "I ABC" bukannya "I ABC+ Chinese Half".
Saat ini, banyak bahasa populer, seperti C# dan Java, menggunakan encoding Unicode 16 (UCS2). Dalam pengkodean ini, semua karakter adalah dua karakter. Oleh karena itu, jika string yang akan dicegat dicampur dengan Cina, Inggris, dan angka, masalah akan muncul, seperti string berikut:
String S = "A Plus B sama dengan C, jika A dll. 1 dan B sama dengan 2, lalu C dll. 3";
String di atas berisi karakter Cina, karakter dan angka bahasa Inggris. Jika Anda ingin mencegat karakter 6 byte pertama, itu harus "plus b, dll.", Tetapi jika Anda menggunakan metode substring untuk mencegat 6 karakter pertama, itu akan menjadi "A Plus B sama dengan C". Alasan untuk masalah ini adalah bahwa metode substring memperlakukan karakter Cina-byte ganda sebagai satu karakter byte (karakter UCS2).
Jumlah byte yang ditempati oleh huruf bahasa Inggris dan karakter Cina dalam format pengkodean yang berbeda juga berbeda. Kita dapat menggunakan contoh -contoh berikut untuk melihat berapa banyak byte surat bahasa Inggris dan karakter Cina menempati beberapa format penyandian yang umum.
impor java.io.unsupportedencodingException; Public Class EncodeTest { / ** * Cetak jumlah byte dan encoding nama string di bawah pengkodean yang ditentukan ke konsol * * @param s * string * @param encodingname * Format encoding * / public static void printbytelength (string s, string encodingName) {System.out.print ("byprint (" ("(" ("(") {out.out.out.print ("(") {out.out.out.print (") {oUt.out.out.print (" (") {oUt.out.out.print (") coba {System.out.print (s.getbytes (encodingName) .length); } catch (UnsupportedEncodingException e) {e.printstacktrace (); } System.out.println ("; encoding:" + encodingName); } public static void main (string [] args) {string en = "a"; String ch = "orang"; // Hitung jumlah byte surat bahasa Inggris di bawah berbagai pengkodean sistem.out.println ("Surat Bahasa Inggris:" + en); 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 (); // Hitung jumlah byte karakter Cina di bawah berbagai pengkodean sistem.out.println ("Karakter Cina:" + Ch); 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"); }}Hasil operasi adalah sebagai berikut:
1. Surat bahasa Inggris: a
2. Jumlah byte: 1; Pengkodean: GB2312
3. Jumlah byte: 1; Pengkodean: GBK
4. Jumlah byte: 1; Pengkodean: GB18030
5. Jumlah byte: 1; Pengkodean: ISO-8859-1
6. Jumlah byte: 1; Pengkodean: UTF-8
7. Jumlah byte: 4; Pengkodean: UTF-16
8. Jumlah byte: 2; Pengkodean: UTF-16BE
9. Jumlah byte: 2; Pengkodean: UTF-16LE
10. Karakter Cina: Orang
11. Jumlah byte: 2; Pengkodean: GB2312
12. Jumlah byte: 2; Pengkodean: GBK
13. Jumlah byte: 2; Pengkodean: GB18030
14. Jumlah byte: 1; Pengkodean: ISO-8859-1
15. Jumlah byte: 3; Pengkodean: UTF-8
16. Jumlah byte: 4; Pengkodean: UTF-16
17. Jumlah byte: 2; Pengkodean: UTF-16BE
18. Jumlah byte: 2; Pengkodean: UTF-16LE
UTF-16BE dan UTF-16LE adalah dua anggota keluarga pengkodean Unicode. Standar Unicode mendefinisikan tiga format pengkodean: UTF-8, UTF-16, dan UTF-32, dan memiliki tujuh skema pengkodean: UTF-8, UTF-16, UTF-16BE, UTF-16LE, UTF-32, UTF-32BE, dan UTF-32LE. Skema pengkodean yang digunakan oleh Java adalah UTF-16BE. Dari hasil berjalan dari contoh di atas, kita dapat melihat bahwa tiga format pengkodean GB2312, GBK, dan GB18030 semuanya dapat memenuhi persyaratan pertanyaan. Mari kita ambil pengkodean GBK sebagai contoh untuk dijawab.
Kami tidak dapat secara langsung menggunakan metode substring (int beginindex, int endIndex) dari kelas string karena dicegat berdasarkan karakter. Baik 'I' dan 'Z' diperlakukan sebagai satu karakter, dan kedua panjangnya adalah 1. Faktanya, selama kita dapat membedakan antara karakter Cina dan huruf bahasa Inggris, masalah ini akan dipecahkan dengan mudah. Perbedaannya adalah bahwa karakter Cina adalah dua byte dan huruf bahasa Inggris adalah satu byte.
Paket com.newyulong.iptv.billing.ftpuppload; impor java.io.unsupportedencodingException; cutstring kelas publik { / *** Tentukan apakah itu adalah karakter Cina** @param c* karakter* @return berarti itu adalah karakter Cina, palsu berarti itu adalah huruf Inggris* @param c* @return berarti itu adalah karakter Cina, palsu berarti itu adalah huruf Inggris* @phows Uncupported @Trows yang tidak disuntikkan* Boolean statis adalah Chinesechar (char c) melempar UnsportedencodingException {// Jika jumlah byte lebih besar dari 1, itu adalah karakter Cina // cara ini tidak terlalu ketat dalam membedakan huruf bahasa Inggris dari karakter Cina, tetapi dalam pertanyaan ini, penilaian ini cukup untuk mengembalikan string. } / *** Intercept String byte** @param string asli* @param count* digit intersepted* @return string interseped* @throws UnsupportedencodingException* Gunakan format pengkodean yang tidak didukung oleh Java IS NOR / NOLLUCT IS NOR / NOLD NOUSION, NOR / NOLD NOUSICE, IS NOR / NOLOCL NOUS NOUROD IS NORCODEKSICE (NOBLOWS NOR / NOLLUCK (NORTOL IS NORTATICE (NORTOL NOR / NORTERCCECTECCECTION (IS NORTATICE, IS NORTATICE, IS NORTATICE (INI ! = null &&! "". Equals (orignal))) {// Konversi string asli ke format pengkodean gbk orignal = string baru (orignal.getbytes (), "UTF-8"); // // System.out.println (orignal); //System.out.println(orignal.getbytes().length); // Jumlah byte yang akan dicegat lebih besar dari 0 dan kurang dari jumlah byte dari string asli if (count> 0 && count <orignal.getbytes ("utf-8"). Panjang) {stringBuffer buff = new stringBuffer (); Char C; untuk (int i = 0; i <count; i ++) {System.out.println (count); c = original.charat (i); Buff.Append (c); if (cutstring.ischinesechar (c)) {// Saat menemukan karakter Cina, potong jumlah total byte byte dengan 1 -count; }} // system.out.println (string baru (buff.toString (). GetBytes ("gbk"), "utf-8")); mengembalikan string baru (buff.toString (). getBytes (), "UTF-8"); }} return asli; } / *** Intercept String byte** @param string asli* @param count* Digit intersep* @return string intersepted* @Throws UnsupportedencodingException* format pengkodean yang digunakan yang tidak didukung oleh Java (string public {nors original, inti asli) yang tidak didukung oleh public {string original, nors nor nora nora nora nora nora nora nora nora nor. ! = null &&! "". Equals (orignal))) {// Konversi string asli ke format pengkodean gbk orignal = string baru (orignal.getbytes (), "gbk"); // Jumlah byte yang akan dicegat lebih besar dari 0 dan kurang dari jumlah byte dari string asli if (count> 0 && count <orignal.getbytes ("gbk"). Panjang) {stringBuffer buff = new stringBuffer (); Char C; untuk (int i = 0; i <count; i ++) {c = orignal.charat (i); Buff.Append (c); if (cutstring.ischinesechar (c)) {// Saat menemukan karakter Cina, potong jumlah total byte menjadi 1 -count; }} return buff.toString (); }} return asli; } /** * Determine whether the passed string is greater than the specified bytes, if it is greater than the recursive call* until it is less than the specified bytes* @param s * Original string* @param num * Passing in to specify the number of bytes* @return String The intercepted string*/ public static String idgui(String s,int num){ int changdu = s.getBytes().length; if (changdu> num) {s = s.substring (0, s.length () - 1); s = idgui (s, num); } return s; } public static void main (string [] args) melempar Exception {// String string asli S = "i zwr love you java"; System.out.println ("String mentah:" + s + ": jumlah byte adalah:" + s.getbytes (). Panjang); /* System.out.println ("mencegat 1 digit pertama:" + cutstring.substring (s, 1)); System.out.println ("mencegat 2 digit pertama:" + cutstring.substring (s, 2)); System.out.println ("mencegat 4 bit pertama:" + cutstring.substring (s, 4)); *///System.out.println("Incept 12 bit pertama: " + cutstring.substring (s, 12)); System.out.println ("mencegat 12 byte pertama:" + cutstring.idgui (S, 11)); }}Solusi di atas untuk Java mencegat string dengan karakter Cina oleh byte (disarankan) adalah semua konten yang saya bagikan dengan Anda. Saya harap ini dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.