Cet article présente principalement des informations pertinentes sur des exemples détaillés d'interception de chaînes Java. Voici un exemple de code pour vous aider à réaliser une telle fonction. Les amis dans le besoin peuvent se référer à
chaîne Java Explication détaillée de. exemples interceptés
Avant-propos :
En Java, la longueur de la chaîne "abcd" et de la chaîne "abhello" sont les mêmes, toutes deux quatre caractères.
Mais le nombre d'octets correspondant est différent, un caractère chinois occupe deux octets.
Définissez une méthode pour obtenir une sous-chaîne basée sur le nombre d'octets spécifié.
Par exemple : pour "Bonjour ab", si vous prenez trois octets, alors la sous-chaîne est la moitié du mot ab et "vous", alors la moitié doit être supprimée.
Si vous prenez quatre octets, c'est "ab you", et si vous prenez cinq octets, c'est toujours "ab you".
Seuls les encodages GBK et utf-8 sont pris en compte.
Exemple de code :
import java.io.UnsupportedEncodingException; import org.junit.Test; /** * @author<a href="mailto:953801304@qq.com" rel="external nofollow" >胡龙华</a> * @version 2017-4-4 下午1:08:45 * @fileName StringCut.java */ public class StringCut { @Test public void analyze(){ String str1 = "你好abc"; byte[] bs1=null; byte[] bs2=null; try { bs1 = str1.getBytes("GBK"); System.out.println("---GBK---"); for(byte b:bs1){ System.out.print(b+" "); } System.out.println(); //-60 -29 -70 -61 97 98 99 // 发现规律,再gbk中一个中文汉字 都是以两个字节 小于0的数存储 bs2 = str1.getBytes("utf-8"); System.out.println("---utf-8---"); for(byte b:bs2){ System.out.print(b+" "); } //-28 -67 -96 -27 -91 -67 97 98 99 // 发现规律,在utf-8中一个中文汉字 是以三个字节 小于0 的数存储 } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } /** * 思路:从第len个往前数,连续2的倍数个负数则全部输出,单数个则去掉最后一个输出 * @param str * @param len * @return */ private static String StringCutByGBK(String str,int len){ byte[] bs = null; try { int count = 0; bs = str .getBytes("GBK"); for(int i=len-1;i>=0;i--){ if(bs[i]<0){ count++; }else{ break; } // 0 1 2 3 4 5 6 7 8 9 10 11 12 } //-60 -29 -70 -61 -80 -95 97 98 99 -76 -17 -72 -25 if(count%2==0){ String s=new String(bs, 0, len, "GBK"); System.out.println("截取"+len+"个字符:"+s); }else{ String s=new String(bs, 0, len-1, "GBK"); System.out.println("截取"+len+"个字符:"+s); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return null; } /** * 思路:从第len个往前数,连续3的倍数个负数则全部输出,其他情况则去掉最后count%3个输出 * @param str * @param len * @return */ private static String StringCutByUTF8(String str,int len){ byte[] bs = null; try { int count = 0; bs = str .getBytes("UTF-8"); for(int i=len-1;i>=0;i--){ if(bs[i]<0){ count++; }else{ break; } } // 0 1 2 3 4 5 6 7 8 9 10 11 12 //-60 -29 -70 -61 -80 -95 97 98 99 -76 -17 -72 -25 if(count%3==0){ String s=new String(bs, 0, len, "UTF-8"); System.out.println("截取"+len+"个字符:"+s); }else{ String s=new String(bs, 0, len-count%3, "UTF-8"); System.out.println("截取"+len+"个字符:"+s); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return null; } @Test public void TEST() { String str = "你好啊abc达哥"; try { System.out.println("---测试gbk---"); byte bs [] = str.getBytes("GBK"); for(int i=0;i<=bs.length;i++){ //System.out.print(bs[i]+" "); StringCutByGBK(str,i); } System.out.println("---测试UTF-8---"); byte bs2 [] = str.getBytes("utf-8"); for(int i=0;i<=bs2.length;i++){ //System.out.print(bs[i]+" "); StringCutByUTF8(str,i); } } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!