package test; import java.io.*; import java.nio.charset.Charset; import java.sql.SQLClientInfoException; import java.text.DateFormat; import java.text.ParsePosition; import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.CountDownLatch; import java.util.zip.InflaterInputStream; import javax.annotation.processing.FilerException; import javax.management.RuntimeErrorException; import javax.swing.text.AbstractDocument.LeafElement; import privateclass.Filterby_Name; import privateclass.Filterby_hidden; import privateclass.Filterby_java; import privateclass.MyBufferedReader; import privateclass.Person; public class Main { private static final String space_operator = " "; private static final double pi = Math.PI; private static final String LINE_SEPARATOR = System.getProperty("line.separator"); private static final int SIZE = 1024*1024; /* * 我们值到一个英文是一个字节 * 一个中文在gbk里面是两个字节 * 在utf-8里面是三个字节 * 我们现在的要求是截取字节 * 例如当我们的字符串是“aas你好呀” * 我们截取三个字节是aas; * 截取四个字节是aas * 截取五个字节是aas你 */ public static void main(String[] args) throws Exception { String str = "aas你好呀"; int len = 0; democutting(str); } public static void democutting(String str) throws IOException { int len = str.getBytes().length; byte buf[] = str.getBytes("gbk"); for(int i = 1; i <= len; i ++) { System.out.println("截取" + i + "个字节的结果是" + cuttinggbkbyte(str, i)); } } /* * 我们知道gbk中的绝大多数字符是都是由两个负数组成 * 思路:我们直接判断截取的字符尾是不是负数 * 如果是负数我们就倒着数负数的个数如果是奇数个负数我们就舍弃尾数 * 如果是偶数个我们就。。。 * utf-8和这个方法基本相同就是判断的时候看是不是三的倍数不是三的倍数就舍弃 * *思考:为什么有些中文在gbk的编码是一正一负我们还能用到这个方法 */ public static String cuttinggbkbyte(String str, int len) throws IOException { byte buf[] = str.getBytes("gbk"); int count = 0; for(int i = len - 1; i >= 0; i --) { if(buf[i] < 0) { count++; } } if(count % 2 == 1) { return new String(buf,0,len - 1); } else { return new String(buf,0,len); } } }