Dado que el campo Oracle utilizado por la interfaz es un número fijo de bytes, y se estima que la cadena pasada es mayor que el número total de bytes en el campo de la base de datos, entonces se intercepta una cadena más pequeña que el número de bytes en la base de datos.
Me refiero a los ejemplos en Internet y solo completo una llamada recursiva, porque la longitud de los bytes del carácter interceptado debe ser menor que la longitud de los bytes de la base de datos, es decir, si el último carácter es un carácter chino, entonces solo puede eliminar la intersección hacia adelante.
/*** Determine si la cadena pasada es mayor que el byte especificado. If it is greater than the recursive call* until it is less than the specified byte number, be sure to specify the character encoding, because the character encoding of each system is different and the number of bytes is also different* @param s * Original string * @param num * Passing in to specify the number of bytes* @return String Intercepted string* @throws UnsupportedEncodingException */ public static String idgui(String s,int num) lanza la excepción {int changdu = s.getBytes ("utf-8"). longitud; if (changdu> num) {s = s.substring (0, s.length () - 1); s = idgui (s, num); } return s; }Preguntas de la entrevista de Java:
Escriba una función que intercepte cadenas, ingrese como una cadena y bytes, y salga como una cadena interceptada por bytes. Sin embargo, debe asegurarse de que los caracteres chinos no sean cortados a la mitad. Por ejemplo, "I ABC" 4 debe cortarse como "I AB", ingresar "I ABC Chinese Def", y 6 debe ser emitido como "I ABC" en lugar de "I ABC+ Half china".
Actualmente, muchos idiomas populares, como C# y Java, utilizan la codificación de Unicode 16 (UCS2). En esta codificación, todos los personajes son dos personajes. Por lo tanto, si la cadena a interceptar se mezcla con chino, inglés y números, surgirán problemas, como la siguiente cadena:
Cadena S = "A Plus B es igual a C, si a, etc. 1 y B es igual a 2, entonces C, etc. 3";
La cadena anterior contiene caracteres chinos, caracteres ingleses y números. Si desea interceptar los caracteres de los primeros 6 bytes, debe ser "A Plus B, etc.", pero si usa el método de subcadena para interceptar los primeros 6 caracteres, se convertirá en "A Plus B es igual a C". La razón de este problema es que el método de subcadena trata los caracteres chinos de doble byte como un carácter de byte (caracteres UCS2).
El número de bytes ocupados por letras inglesas y caracteres chinos en diferentes formatos de codificación también es diferente. Podemos usar los siguientes ejemplos para ver cuántos bytes una carta en inglés y un personaje chino ocupan en algunos formatos de codificación comunes.
import java.io.unsupportedencodingException; clase pública Encodetest { / ** * Imprima el número de bytes y el nombre de codificación de la cadena debajo de la codificación especificada a la consola * * @param s * string * @param codingname * format de codificación * / public static void (string s, string codingname) {system.print ("bytes:"); "); intente {system.out.print (s.getBytes (codingname) .length); } catch (UnsupportedEncodingException e) {E.PrintStackTrace (); } System.out.println ("; codificación:" + codingname); } public static void main (string [] args) {String en = "A"; Cadena ch = "personas"; // Calcule el número de bytes de una letra en inglés bajo varios codificaciones System.out.println ("Letra en inglés:" + 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 (); // Calcule el número de bytes de un carácter chino en varios codificaciones System.out.println ("Carácter chino:" + 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"); }}Los resultados de la operación son los siguientes:
1. Letras en inglés: A
2. Número de bytes: 1; Codificación: GB2312
3. Número de bytes: 1; Codificación: GBK
4. Número de bytes: 1; Codificación: GB18030
5. Número de bytes: 1; Codificación: ISO-8859-1
6. Número de bytes: 1; Codificación: UTF-8
7. Número de bytes: 4; Codificación: UTF-16
8. Número de bytes: 2; Codificación: UTF-16BE
9. Número de bytes: 2; Codificación: UTF-16le
10. Caracteres chinos: gente
11. Número de bytes: 2; Codificación: GB2312
12. Número de bytes: 2; Codificación: GBK
13. Número de bytes: 2; Codificación: GB18030
14. Número de bytes: 1; Codificación: ISO-8859-1
15. Número de bytes: 3; Codificación: UTF-8
16. Número de bytes: 4; Codificación: UTF-16
17. Número de bytes: 2; Codificación: UTF-16BE
18. Número de bytes: 2; Codificación: UTF-16le
UTF-16BE y UTF-16LE son dos miembros de la familia que codifica Unicode. El estándar Unicode define tres formatos de codificación: UTF-8, UTF-16 y UTF-32, y tiene siete esquemas de codificación: UTF-8, UTF-16, UTF-16BE, UTF-16LE, UTF-32, UTF-32BE y UTF-32LE. El esquema de codificación utilizado por Java es UTF-16BE. A partir de los resultados de ejecución del ejemplo anterior, podemos ver que los tres formatos de codificación de GB2312, GBK y GB18030 pueden cumplir con los requisitos de la pregunta. Tomemos la codificación de GBK como un ejemplo para responder.
No podemos usar directamente el método subcandal (int beginIndex, int endindex) de la clase de cadena porque es interceptado por el carácter. Tanto 'I' como 'Z' son tratados como un carácter, y ambas longitudes es 1. De hecho, siempre que podamos distinguir entre caracteres chinos y letras inglesas, este problema se resolverá fácilmente. La diferencia es que los caracteres chinos son dos bytes y las letras inglesas son un byte.
paquete com.newyulong.iptv.billing.ftpupload; import java.io.unsupportedenCodingException; public class CutString { /*** Determine si es un personaje chino** @param c* carácter* @return verdadero significa que es un carácter chino, falso significa que es una carta inglesa* @retrasa la no comportación deceptores Java*/ public static boolean es Chinesecar (Char C) lanza sin apoyo aCodingException {// Si el número de bytes es mayor que 1, es un personaje chino // } / *** Cadena de interceptación por byte** @param Cadena original* @param Condado* dígitos interceptados* @return cadena interceptada* @throws UnsupportedEncodingException* Usar formatos de codificación que Java no admite* / public String String (String Original, int Count) lanza sin apoyo. ! = null &&! "". Equals (Orignal)) {// Convierta la cadena original en formato de codificación GBK orignal = new String (orignal.getBytes (), "utf-8"); // // system.out.println (orignal); //System.out.println(orignal.getBytes().length); // El número de bytes que se interceptarán es mayor que 0 y menor que el número de bytes de la cadena original if (Count> 0 && Count <Orignal.getBytes ("UTF-8"). Longitud) {StringBuffer Buff = new StringBuffer (); char c; for (int i = 0; i <count; i ++) {system.out.println (count); c = original.charat (i); buff.append (c); if (CutString.IschineSechar (c)) {// Al encontrar caracteres chinos, corte el número total de bytes bytes por 1 -contenido; }} // system.out.println (new String (buff.ToString (). GetBytes ("GBK"), "UTF-8")); return new String (buff.ToString (). getBytes (), "UTF-8"); }} return original; } / *** Cadena de interceptación por byte** @param cadena original* @param cuenta* dígitos de interceptación* @return cadena interceptada* @throws UnsupportedEncodingException* Usado formatos de codificación que Java no admite* / public static String gsubString (string original, int count) lanza no supportedEncodingexception {// los personajes originales no son nuecidos (no son núcleos (no son (no son numerosos, ni si hay nuguros (o no son núcleos (no están nuecidos (no están nuecidos (no son (no son numerosas (no son (no son los stils. ! = null &&! "". Equals (Orignal)) {// Convierta la cadena original en formato de codificación GBK orignal = new String (orignal.getBytes (), "gbk"); // El número de bytes que se interceptarán es mayor que 0 y menor que el número de bytes de la cadena original if (Count> 0 && Count <Orignal.getBytes ("GBK"). Longitud) {StringBuffer Buff = new StringBuffer (); char c; para (int i = 0; i <count; i ++) {c = orignal.charat (i); buff.append (c); if (CutString.IschineSecar (c)) {// Al encontrar caracteres chinos, corte el número total de bytes en 1 -cuent; }} return buff.ToString (); }} return original; } / *** Determine si la cadena pasada es mayor que los bytes especificados, si es mayor que la llamada recursiva* hasta que sea menor que los bytes especificados* @param s* string original* @param num* Pasando para especificar el número de bytes* @return cadena* / public string estática Idgui (cadena s, int if (changdu> num) {s = s.substring (0, s.length () - 1); s = idgui (s, num); } return s; } public static void main (string [] args) lanza la excepción {// cadena original de cadena S = "i zwr lo amo java"; System.out.println ("Cadena sin procesar:" + S + ": el número de bytes es:" + s.getBytes (). Longitud); /* System.out.println ("Intercepe el primer dígito de 1:" + CutString.sUbstring (s, 1)); System.out.println ("Intercepe los primeros 2 dígitos:" + CutString.sUbstring (s, 2)); System.out.println ("Intercepe los primeros 4 bits:" + CutString.sUbstring (s, 4)); *///System.out.println("intercept los primeros 12 bits: " + CutString.sUbstring (s, 12)); System.out.println ("Intercepe los primeros 12 bytes:" + CutString.idgui (s, 11)); }}La solución anterior a las cadenas de interceptación de Java con caracteres chinos por bytes (recomendado) es todo el contenido que comparto con ustedes. Espero que pueda darle una referencia y espero que pueda apoyar más a Wulin.com.