Étant donné que le champ Oracle utilisé par l'interface est un nombre fixe d'octets, et que la chaîne passée est estimée à plus grande que le nombre total d'octets dans le champ de base de données, une chaîne plus petite que le nombre d'octets dans la base de données est interceptée.
Je me réfère aux exemples sur Internet et je termine juste un appel récursif, car la longueur d'octets du caractère intercepté doit être plus petite que la longueur d'octets de la base de données, c'est-à-dire que si le dernier caractère est un caractère chinois, alors vous ne pouvez supprimer l'interception en avant.
/ ** * Déterminer si la chaîne passée est supérieure à l'octet spécifié. S'il est supérieur à l'appel récursif * jusqu'à ce qu'il soit inférieur au numéro d'octet spécifié, assurez-vous de spécifier le codage des caractères, car le codage de caractères de chaque système est différent et le nombre d'octets est également différent * @param s * chaîne d'origine * @param num * Passage pour spécifier le nombre de bytes * @return String String * @Throws UnsuPPorTeDendenCing num) lève l'exception {int changdu = s.getBytes ("utf-8"). Longueur; if (changdu> num) {s = s.substring (0, s.length () - 1); s = idgui (s, num); } return s; }Questions d'interview de Java:
Écrivez une fonction qui intercepte les chaînes, les entrées en tant que chaîne et octets, et les sorties en tant que chaîne interceptée par les octets. Cependant, vous devez vous assurer que les caractères chinois ne sont pas coupés la moitié. Par exemple, "I ABC" 4 devrait être coupé comme "I AB", entrez "I ABC Chinese Def", et 6 devrait être sorti comme "I ABC" au lieu de "I ABC + Chinese Half".
Actuellement, de nombreuses langues populaires, telles que C # et Java, utilisent un codage Unicode 16 (UCS2). Dans ce codage, tous les personnages sont deux personnages. Par conséquent, si la chaîne à intercepter est mélangée avec du chinois, de l'anglais et des nombres, des problèmes surviendront, comme la chaîne suivante:
String S = "A Plus B est égal à C, si A etc. 1 et B équivaut à 2, alors C etc. 3";
La chaîne ci-dessus contient à la fois des caractères chinois, des caractères anglais et des nombres. Si vous voulez intercepter les caractères des 6 premiers octets, il devrait être "un plus B, etc.", mais si vous utilisez la méthode de la sous-chaîne pour intercepter les 6 premiers caractères, il deviendra "un plus b égal C". La raison de ce problème est que la méthode de la sous-chaîne traite les caractères chinois de double octet comme un caractère d'octet (caractères UCS2).
Le nombre d'octets occupés par des lettres anglais et des caractères chinois dans différents formats de codage est également différent. Nous pouvons utiliser les exemples suivants pour voir combien d'octets une lettre anglaise et un caractère chinois occupent dans certains formats de codage communs.
Importer java.io.UNSUPPORTEDENCODINGException; Classe publique EncodeTest {/ ** * Imprimez le nombre d'octets et le nom de codage de la chaîne sous l'encodage spécifié à la console * * @param s * string * @param EncodingName * Encoding Format * / public static void printByTelngth (String s, string EncodingName) {System.out.print ("bytes:"); try {System.out.print (s.getBytes (EncodingName) .Length); } catch (UnportEnCcodingException e) {e.printStackTrace (); } System.out.println ("; Encoding:" + EncodingName); } public static void main (string [] args) {String ens = "a"; String ch = "People"; // Calculez le nombre d'octets d'une lettre anglaise sous divers encodages System.out.println ("Lettre anglaise:" + 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 (); // Calculez le nombre d'octets d'un caractère chinois sous divers encodages System.out.println ("Caractère chinois:" + 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"); }}Les résultats de l'opération sont les suivants:
1. Lettres anglaises: A
2. Nombre d'octets: 1; Encodage: GB2312
3. Nombre d'octets: 1; Encodage: GBK
4. Numéro d'octets: 1; Encodage: GB18030
5. Numéro d'octets: 1; Encodage: ISO-8859-1
6. Numéro d'octets: 1; Encodage: UTF-8
7. Numéro d'octets: 4; Encodage: UTF-16
8. Numéro d'octets: 2; Encodage: UTF-16BE
9. Numéro d'octets: 2; Encodage: UTF-16LE
10. Caractères chinois: les gens
11. Numéro d'octets: 2; Encodage: GB2312
12. Numéro d'octets: 2; Encodage: GBK
13. Numéro d'octets: 2; Encodage: GB18030
14. Numéro d'octets: 1; Encodage: ISO-8859-1
15. Numéro d'octets: 3; Encodage: UTF-8
16. Nombre d'octets: 4; Encodage: UTF-16
17. Nombre d'octets: 2; Encodage: UTF-16BE
18. Numéro d'octets: 2; Encodage: UTF-16LE
UTF-16BE et UTF-16Le sont deux membres de la famille Unicode Encoding. La norme Unicode définit trois formats de codage: UTF-8, UTF-16 et UTF-32, et dispose de sept schémas de codage: UTF-8, UTF-16, UTF-16BE, UTF-16Le, UTF-32, UTF-32BE et UTF-32LE. Le schéma d'encodage utilisé par Java est UTF-16BE. D'après les résultats en cours d'exécution de l'exemple ci-dessus, nous pouvons voir que les trois formats de codage de GB2312, GBK et GB18030 peuvent tous répondre aux exigences de la question. Prenons le codage de GBK comme exemple pour répondre.
Nous ne pouvons pas utiliser directement la méthode de la sous-chaîne (int débutant, int endIndex) de la classe de chaîne car elle est interceptée par le caractère. «I» et «z» sont traités comme un seul personnage, et les deux longueurs sont 1. En fait, tant que nous pouvons distinguer les caractères chinois et les lettres anglaises, ce problème sera facilement résolu. La différence est que les caractères chinois sont deux octets et les lettres anglaises sont un octet.
Package com.newyulong.iptv.billing.ftpupload; import java.io.unsupportedEncodingException; public class cutString {/ ** * déterminer s'il s'agit d'un caractère chinois * * @param c * caractère * @return true signifie un caractère chinois, des moyens de faux moyens qui ne sont pas un formulaire de jeu d'anglais * Le booléen statique est Chinesechar (char c) lance unporttedencodingException {// Si le nombre d'octets est supérieur à 1, c'est un caractère chinois // de cette façon n'est pas très rigoureux pour distinguer les lettres anglaises des caractères chinois, mais dans cette question, ce jugement suffit pour retourner String.Valueof (c) .getBytes ("utf-8"). Longueur> 1; } / ** * Intercept String by byte * * @param String d'origine * @param count * chiffres interceptés * @return String intercepté * @throws UnportEdenCcodingException * Utiliser des formats d'encoding que Java ne prend pas en charge * / public static static substrating (String Original, int count) lance norwe ! = null &&! "". equals (orignal)) {// convertir la chaîne d'origine en format de codage gbk orignal = new String (orignal.getBytes (), "utf-8"); // // system.out.println (orignal); //System.out.println(orignal.getbytes().length); // Le nombre d'octets à intercepter est supérieur à 0 et inférieur au nombre d'octets de la chaîne d'origine if (count> 0 && count <orignal.getBytes ("utf-8"). Length) {StringBuffer buff = new StringBuffer (); Char C; pour (int i = 0; i <count; i ++) {System.out.println (count); c = original.charat (i); Buff.APPEND (C); if (cutString.isCheneScar (c)) {// Lorsque vous rencontrez des caractères chinois, coupez le nombre total d'octets d'octets par 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 by byte * * @param String original * @param count * Intercept Digits * @return String intercepté * @Throws UnportEdenCcodingException * Formats d'encodage utilisés que Java ne prend pas en charge * / public static gsubString (String Original, int count) lance les contraintes sans soulage ! = null &&! "". equals (orignal)) {// convertir la chaîne d'origine en format de codage gbk orignal = new String (orignal.getBytes (), "gbk"); // Le nombre d'octets à intercepter est supérieur à 0 et inférieur au nombre d'octets de la chaîne d'origine if (count> 0 && count <orignal.getBytes ("gbk"). Length) {StringBuffer buff = new StringBuffer (); Char C; pour (int i = 0; i <count; i ++) {c = orignal.charat (i); Buff.APPEND (C); if (cutString.isCheneScar (c)) {// Lorsque vous rencontrez des caractères chinois, coupez le nombre total d'octets en 1 - COUNT; }} return buff.toString (); }} return original; } / ** * Déterminez si la chaîne passée est supérieure aux octets spécifiés, s'il est supérieur à l'appel récursif * jusqu'à ce qu'il soit inférieur aux octets spécifiés * @param s * chaîne d'origine * @param num * passant pour spécifier le nombre d'octets * @return String la chaîne interceptée * / public static idgui (string s, int num) {int changdu = s.getbytes (). if (changdu> num) {s = s.substring (0, s.length () - 1); s = idgui (s, num); } return s; } public static void main (String [] args) lève l'exception {// String original String s = "i zwr love you java"; System.out.println ("Raw String:" + S + ": Le nombre d'octets est:" + s.getBytes (). Longueur); / * System.out.println ("Intercepter le premier 1 chiffre:" + CutString.Substring (S, 1)); System.out.println ("Intercepter les 2 premiers chiffres:" + CutString.Substring (S, 2)); System.out.println ("Intercepter les 4 premiers bits:" + CutString.Substring (S, 4)); * / //System.out.println(" Intercept les 12 premiers bits: "+ cutstring.substring (s, 12)); System.out.println ("Intercepter les 12 premiers octets:" + CutString.idGui (S, 11)); }}La solution ci-dessus au Java interceptant les cordes avec les caractères chinois par octets (recommandés) est tout le contenu que je partage avec vous. J'espère que cela pourra vous donner une référence et j'espère que vous pourrez soutenir Wulin.com plus.