Da das von der Schnittstelle verwendete Oracle -Feld eine feste Anzahl von Bytes ist und die in der Datenbank übergebene Zeichenfolge im Feld Datenbank größer als die Gesamtzahl der Bytes ist, wird eine Zeichenfolge, die kleiner als die Anzahl der Bytes in der Datenbank ist, abgefangen.
Ich beziehe mich auf die Beispiele im Internet und vervollständige nur einen rekursiven Anruf, da die Bytelänge des abgefangenen Zeichens kleiner als die Bytelänge der Datenbank sein muss. Wenn das letzte Zeichen ein chinesischer Zeichen ist, können Sie den Intercept nur entfernen.
/*** Bestimmen Sie, ob die in übergebene Zeichenfolge größer ist als das angegebene Byte. Wenn es größer ist als der rekursive Aufruf *, bis er weniger als die angegebene Byte -Nummer ist, geben Sie sicher, dass die Zeichenkodierung der Zeichen unterschiedlich ist und die Anzahl der Bytes auch unterschiedlich ist * @param S * Original String * @param num * num) löst Ausnahme aus {int changdu = s.getBytes ("utf-8"). Länge; if (changdu> num) {s = substring (0, sength () - 1); s = idgui (s, num); } return s; }Java -Interviewfragen:
Schreiben Sie eine Funktion, die Strings abfängt, als Zeichenfolge und Bytes eingibt und als Zeichenfolge, die von Bytes abgefangen wird, ausgegeben. Sie müssen jedoch sicherstellen, dass die chinesischen Charaktere nicht zur Hälfte abgeschnitten werden. Zum Beispiel sollte "I ABC" 4 als "I AB" abgeschnitten werden, eingeben "I ABC Chinese Def", und 6 sollte als "I ABC" anstelle von "I ABC+ Chinese -Hälfte" ausgegeben werden.
Derzeit verwenden viele beliebte Sprachen wie C# und Java die Codierung von Unicode 16 (UCS2). In dieser Codierung sind alle Charaktere zwei Zeichen. Wenn die zu abgefangene Zeichenfolge mit Chinesisch, Englisch und Zahlen gemischt wird, treten Probleme auf, wie beispielsweise die folgende Zeichenfolge:
String S = "A plus b gleich c, wenn a usw. 1 und b gleich 2, dann c usw. 3";
Die obige Zeichenfolge enthält sowohl chinesische Zeichen als auch englische Zeichen und Zahlen. Wenn Sie die Zeichen der ersten 6 Bytes abfangen möchten, sollte es "a plus b usw." sein. Wenn Sie jedoch die Substring -Methode verwenden, um die ersten 6 Zeichen abzufangen, wird es "A plus b gleich C". Der Grund für dieses Problem ist, dass die Substring-Methode doppelte chinesische Zeichen als ein Byte-Zeichen (UCS2-Zeichen) behandelt.
Die Anzahl der Bytes, die von englischen Buchstaben und chinesischen Zeichen in verschiedenen Codierungsformaten besetzt sind, ist ebenfalls unterschiedlich. Wir können die folgenden Beispiele verwenden, um zu sehen, wie viele Bytes ein englischer Brief und ein chinesischer Charakter in einigen gemeinsamen Codierungsformaten einnehmen.
importieren java.io.unsupportedenCodingException; Public Class Encodetest { / ** * Drucken Sie die Anzahl der Bytes und den Codierungsnamen der Zeichenfolge unter der angegebenen Codierung der Konsole * * @param try {System.out.print (S.GetBytes (codingName) .Length); } catch (unportedenCodingException e) {e.printstacktrace (); } System.out.println ("; Codierung:" + codingName); } public static void main (String [] args) {String en = "a"; String ch = "people"; // Berechnen Sie die Anzahl der Bytes eines englischen Buchstabens unter verschiedenen Codings System.out.println ("English Letter:" + en); Codetest.printbyTelength (en, "gb2312"); Codetest.printbyTelength (en, "gbk"); Codetest.printbyTelength (en, "gb18030"); Codetest.printbyTelength (en, "iso-8859-1"); Codetest.printbyTelength (en, "utf-8"); Codetest.printbyTelength (en, "utf-16"); Codetest.printbyTelength (en, "utf-16be"); Codetest.printbyTelength (en, "utf-16le"); System.out.println (); // Berechnen Sie die Anzahl der Bytes eines chinesischen Zeichens unter verschiedenen Codings -Systemen. Codetest.printbyTelength (ch, "gb2312"); Codetest.printbyTelength (ch, "gbk"); Codetest.printbyTelength (CH, "GB18030"); Codetest.printbyTelength (ch, "iso-8859-1"); Codetest.printbyTelength (ch, "utf-8"); Codetest.printbyTelength (ch, "utf-16"); Codetest.printbyTelength (ch, "utf-16be"); Codetest.printbyTelength (ch, "utf-16le"); }}Die Betriebsergebnisse sind wie folgt:
1. Englische Buchstaben: a
2. Anzahl der Bytes: 1; Codierung: GB2312
3. Anzahl der Bytes: 1; Codierung: GBK
4. Anzahl der Bytes: 1; Codierung: GB18030
5. Anzahl der Bytes: 1; Codierung: ISO-8859-1
6. Anzahl der Bytes: 1; Codierung: UTF-8
7. Anzahl der Bytes: 4; Codierung: UTF-16
8. Anzahl der Bytes: 2; Codierung: UTF-16BE
9. Anzahl der Bytes: 2; Codierung: UTF-16LE
10. Chinesische Charaktere: Menschen
11. Anzahl der Bytes: 2; Codierung: GB2312
12. Anzahl der Bytes: 2; Codierung: GBK
13. Anzahl der Bytes: 2; Codierung: GB18030
14. Anzahl der Bytes: 1; Codierung: ISO-8859-1
15. Anzahl der Bytes: 3; Codierung: UTF-8
16. Anzahl der Bytes: 4; Codierung: UTF-16
17. Anzahl der Bytes: 2; Codierung: UTF-16BE
18. Anzahl der Bytes: 2; Codierung: UTF-16LE
UTF-16BE und UTF-16LE sind zwei Mitglieder der Unicode-Codierungsfamilie. Der Unicode-Standard definiert drei Codierungsformate: UTF-8, UTF-16 und UTF-32 und verfügt über sieben Codierungsschemata: UTF-8, UTF-16, UTF-16BE, UTF-16LE, UTF-32, UTF-32BE und UTF-32LE. Das von Java verwendete Codierungsschema ist UTF-16BE. Aus den laufenden Ergebnissen des obigen Beispiels können wir sehen, dass die drei Codierungsformate von GB2312, GBK und GB18030 die Anforderungen der Frage entsprechen können. Nehmen wir die GBK -Codierung als Beispiel zur Beantwortung.
Wir können die Methode der Substring (int begindeIndex, int EndIndex) der String -Klasse nicht direkt verwenden, da sie durch Zeichen abgefangen wird. Sowohl "I" als auch "Z" werden als eine Figur behandelt, und beide Längen sind 1. solange wir zwischen chinesischen und englischen Buchstaben unterscheiden können, wird dieses Problem leicht gelöst. Der Unterschied besteht darin, dass chinesische Charaktere zwei Bytes und englische Buchstaben sind ein Byte.
Paket com.newyulong.iptv.billing.ftpupload; importieren java.io.unsupportedencodingException; öffentliche Klasse Cutstring { / *** Bestimmen Sie, ob es sich um ein chinesischer Charakter handelt. Boolean ist Chinesechar (char c) wirft eine nicht unterstützte Ancedexception aus (wenn die Anzahl der Bytes größer als 1 ist, es ist ein chinesischer Charakter // Auf diese Weise ist es nicht sehr streng, englische Briefe von chinesischen Zeichen zu unterscheiden, aber in dieser Frage reicht dieses Urteil aus, um String zurückzugeben. } / *** Intercept String von BYTE** @param Original String* @param count* Abfangdien null &&! "". Equals (orignal)) {// Die ursprüngliche Zeichenfolge in GBK-Codierungsformat orignal = new String (orignal.getBytes (), "utf-8"); // // System.out.println (Orignal) konvertieren; //System.out.println(orignal.getBytes().Length); // Die Anzahl der abgefangenen Bytes ist größer als 0 und weniger als die Anzahl der Bytes der ursprünglichen Zeichenfolge if (count> 0 && count <orignal.getBytes ("utf-8"). Länge) {StringBuffer buff = new StringBuffer (); Char C; für (int i = 0; i <count; i ++) {System.out.println (count); c = original.charat (i); Buff.Append (c); if (cutstring.iSchineSCHAR (c)) {// Bei der Begegnung chinesischer Zeichen die Gesamtzahl der Bytes -Bytes um 1 -Count; }} // system.out.println (new String (buff.toString (). GetBytes ("gbk"), "utf-8"); return New String (buff.toString (). getBytes (), "utf-8"); }} return original; } / *** Intercept String von Byte** @param Original String* @param count* Abfangjagd* @return intercepted String* @Throws UnsupportedenCodingException* Verwendete codierende Formate, die Java nicht unterstützt* / public static String gsubstring (String original, int Count), die unaufgeehrt sind. NULL &&! "". Equals (orignal)) {// Die ursprüngliche Zeichenfolge konvertieren in gbk codierungsformat orignal = new String (orignal.getBytes (), "gbk"); // Die Anzahl der abgefangenen Bytes ist größer als 0 und weniger als die Anzahl der Bytes der ursprünglichen Zeichenfolge if (count> 0 && count <orignal.getBytes ("gbk"). Länge) {StringBuffer buff = new StringBuffer (); Char C; für (int i = 0; i <count; i ++) {c = orignal.charat (i); Buff.Append (c); if (cutstring.iSchineSCHAR (c)) {// Bei chinesischen Zeichen, schneiden Sie die Gesamtzahl der Bytes in 1 -Count; }} return buff.toString (); }} return original; } / *** Bestimmen Sie, ob die übergebene Zeichenfolge größer ist als die angegebenen Bytes, wenn sie größer als der rekursive Aufruf* ist, bis sie weniger als die angegebenen Bytes* @param S* Original String* @param num* Passing eingeben, um die Anzahl der Bytes* @return String der intercepted String* / public static String anzugeben (String SN) (intn) {int Changn. if (changdu> num) {s = substring (0, sength () - 1); s = idgui (s, num); } return s; } public static void main (String [] args) löst Ausnahme aus {// Original String String S = "i zwr liebe dich java"; System.out.println ("RAW String:" + S + ": Die Anzahl der Bytes lautet:" + s.getBytes (). Länge); /* System.out.println ("Abfangen die erste 1 Ziffer:" + cutstring.substring (s, 1)); System.out.println ("Abfangen die ersten 2 Ziffern:" + cutstring.substring (s, 2)); System.out.println ("Abfangen die ersten 4 Bits:" + cutstring.substring (s, 4)); *///System.out.println("Intercept die ersten 12 Bits: " + cutstring.substring (s, 12)); System.out.println ("Abfangen die ersten 12 Bytes:" + cutstring.idgui (s, 11)); }}Die obige Lösung für die Java -Abfangen von Zeichenfolgen mit chinesischen Zeichen nach Bytes (empfohlen) ist der gesamte Inhalt, den ich mit Ihnen teile. Ich hoffe, es kann Ihnen eine Referenz geben und ich hoffe, Sie können Wulin.com mehr unterstützen.