Como o campo Oracle usado pela interface é um número fixo de bytes, e a string passada é estimada em maior que o número total de bytes no campo do banco de dados, uma sequência menor que o número de bytes no banco de dados é interceptada.
Refiro -me aos exemplos na Internet e apenas concluo uma chamada recursiva, porque o comprimento do byte do caractere interceptado deve ser menor que o comprimento do byte do banco de dados, ou seja, se o último caractere for um caractere chinês, você só poderá remover a interceptação adiante.
/*** Determine se a sequência passada é maior que o byte especificado. Se for maior que a chamada recursiva * até que seja menor que o número de bytes especificado, especifique a codificação do caractere, porque a codificação do caractere de cada sistema é diferente e o número de bytes também é diferente * @param s * string string * @param * passes para especificar o número de bytes * @renGurn string interceptEd * @param não num) lança exceção {int changdu = s.getBytes ("utf-8"). comprimento; if (changdu> num) {s = s.substring (0, s.Length () - 1); s = idgui (s, num); } retornar s; }Perguntas da entrevista em Java:
Escreva uma função que intercepte strings, entradas como uma string e bytes e saídas como uma string interceptada por bytes. No entanto, você deve garantir que os caracteres chineses não sejam cortados metade. Por exemplo, "I ABC" 4 deve ser cortado como "i ab", entra "i abc chines def" e 6 deve ser produzido como "i abc" em vez de "eu abc+ metade chinesa".
Atualmente, muitos idiomas populares, como C# e Java, usam a codificação Unicode 16 (UCS2). Nesta codificação, todos os personagens são dois personagens. Portanto, se a string a ser interceptada for misturada com chinês, inglês e números, surgirão problemas, como a seguinte sequência:
String s = "a mais b é igual a C, se A etc. 1 e B forem igual a 2, então C etc. 3";
A string acima contém caracteres chineses, caracteres em inglês e números. Se você deseja interceptar os caracteres dos 6 primeiros bytes, ele deve ser "A Plus B, etc.", mas se você usar o método de substring para interceptar os 6 primeiros caracteres, ele se tornará "A Plus B for igual a C". A razão para esse problema é que o método de substring trata os caracteres chineses de byte duplo como um caractere de byte (caracteres UCS2).
O número de bytes ocupados por cartas em inglês e caracteres chineses em diferentes formatos de codificação também é diferente. Podemos usar os seguintes exemplos para ver quantos bytes uma carta em inglês e um personagem chinês ocupam em alguns formatos de codificação comuns.
importar java.io.unsupportEnCodingException; public class EncodeTest { /** * Print the number of bytes and encoding name of the string under the specified encoding to the console * * @param s * String * @param encodingName * Encoding format */ public static void printByteLength(String s, String encodingName) { System.out.print("Bytes:"); tente {System.out.print (s.GetBytes (codingName) .Length); } Catch (UnsupportEdEncodingException e) {E.PrintStackTrace (); } System.out.println ("; codificação:" + codingName); } public static void main (string [] args) {string en = "a"; String ch = "pessoas"; // Calcule o número de bytes de uma carta em inglês em vários codificações System.out.println ("Letra Inglês:" + 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 (); // calcule o número de bytes de um caractere chinês sob vários codificações System.out.println ("Caráter chinês:" + ch); 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"); }}Os resultados da operação são os seguintes:
1. Letras em inglês: um
2. Número de bytes: 1; Codificação: GB2312
3. Número de bytes: 1; Codificação: GBK
4. Número de bytes: 1; Codificação: GB18030
5. Número de bytes: 1; Codificação: ISO-8859-1
6. Número de bytes: 1; Codificação: UTF-8
7. Número de bytes: 4; Codificação: UTF-16
8. Número de bytes: 2; Codificação: UTF-16BE
9. Número de bytes: 2; Codificação: UTF-16LE
10. Personagens chineses: pessoas
11. Número de bytes: 2; Codificação: GB2312
12. Número de bytes: 2; Codificação: GBK
13. Número de bytes: 2; Codificação: GB18030
14. Número de bytes: 1; Codificação: ISO-8859-1
15. Número de bytes: 3; Codificação: UTF-8
16. Número de bytes: 4; Codificação: UTF-16
17. Número de bytes: 2; Codificação: UTF-16BE
18. Número de bytes: 2; Codificação: UTF-16LE
UTF-16BE e UTF-16LE são dois membros da família Unicode que codifica. O padrão Unicode define três formatos de codificação: UTF-8, UTF-16 e UTF-32, e possui sete esquemas de codificação: UTF-8, UTF-16, UTF-16BE, UTF-16LE, UTF-32, UTF-32BE e UTF-32LE. O esquema de codificação usado por Java é UTF-16BE. A partir dos resultados em execução do exemplo acima, podemos ver que os três formatos de codificação de GB2312, GBK e GB18030 podem atender aos requisitos da pergunta. Vamos tomar a codificação do GBK como exemplo para responder.
Não podemos usar diretamente o método da substring (int BeginIndex, int endindex) da classe String porque é interceptada pelo caractere. Tanto 'i' e 'z' são tratados como um personagem, e ambos o comprimento é 1. Na verdade, desde que possamos distinguir entre caracteres chineses e letras em inglês, esse problema será resolvido facilmente. A diferença é que os caracteres chineses são dois bytes e as letras em inglês são um byte.
pacote com.newyulong.iptv.billing.ftpupload; importar java.io.unsupportEncodingException; public class Class Cutstring { /*** Determine se é um caractere chinês* @param c* caractered* @return verdadeiro significa que é um caractere chinês, que é um meios falsos que é uma letra inglesa* @TheRox. O booleano estático público é ChinesChar (char c) lança não suportesCodingingException {// Se o número de bytes for maior que 1, é um caractere chinês // dessa maneira não é muito rigoroso em distinguir letras em inglês de caracteres chineses, mas, nessa pergunta, esse julgamento é suficiente para retornar. } / *** interceptar string by byte** @param string original* @param count* dígitos interceptados* @return string interceptada* @throws UnsupportEnDencodingException* Use formatos de codificação que Java não suporta o STATCOdConsceptExtConsConsConsConsConsConsConsConsConsConsConsConsConsConsConstEnTensenst. !] //System.out.println(orignal.getbytes().Length); // O número de bytes a ser interceptado é maior que 0 e menor que o número de bytes da string original se (contagem> 0 && count <orignal.getbytes ("utf-8"). Length) {stringbuffer buff = new stringBuffer (); char c; for (int i = 0; i <count; i ++) {System.out.println (contagem); c = original.charat (i); buff.append (c); if (cutstring.ischinesechar (c)) {// Ao encontrar caracteres chineses, corte o número total de bytes bytes por 1 -contagem; }} // System.out.println (new String (buff.tostring (). GetBytes ("gbk"), "utf-8")); retornar new string (buff.toString (). getBytes (), "utf-8"); }} retornar original; } / *** Interceptar string by byte** @param string original* @param count* interceptar dígitos* @return string interceptada* @Throws UnsupportEnDencodingException* Utilizando formatos de codificação que Java não suporta* / public static string gsubstring (string original, int) !] // O número de bytes a ser interceptado é maior que 0 e menor que o número de bytes da string original se (contagem> 0 && count <orignal.getbytes ("gbk"). Length) {stringbuffer buff = new stringBuffer (); char c; for (int i = 0; i <count; i ++) {c = orignal.charat (i); buff.append (c); if (cutstring.ischinesechar (c)) {// Ao encontrar caracteres chineses, corte o número total de bytes em 1 -contagem; }} return buff.toString (); }} retornar original; } / *** Determine se a string passada é maior que os bytes especificados, se for maior que a chamada recursiva* até que seja menor que os bytes especificados* @param s* string original* @param num* passando para especificar o número de string) {int rang) @Tring; if (changdu> num) {s = s.substring (0, s.Length () - 1); s = idgui (s, num); } retornar s; } public static void main (string [] args) lança exceção {// String string original s = "i zwr te amo java"; System.out.println ("Raw String:" + S + ": o número de bytes é:" + s.getBytes (). Comprimento); /* System.out.println ("Interceptar o primeiro dígito:" + CutString.substring (s, 1)); System.out.println ("Interceptar os 2 primeiros dígitos:" + CutString.substring (S, 2)); System.out.println ("Interceptar os 4 primeiros bits:" + CutString.substring (S, 4)); *///System.out.println("Intercept os 12 primeiros bits: " + cutstring.substring (s, 12)); System.out.println ("Interceptar os 12 primeiros bytes:" + cutstring.idgui (s, 11)); }}A solução acima para o Java Intercepping Strings com caracteres chineses por bytes (recomendado) é todo o conteúdo que compartilho com você. Espero que possa lhe dar uma referência e espero que você possa apoiar mais o wulin.com.