/**
* 定义一个方法,按照指定的长度截取字符.
* 如:对于"ab你好",如果取三个字节,那么子串应该只显示"ab",半个汉字舍去.
* 如果是四个字节就显示"ab你",截取5个字节还是"ab你".
*
* 汉字在GBK编码中是2个字节,字节数组转换成十进制都是负数,
* 汉字在UTF-8中是3个字节,每个字节转换成十进制也是负数.
*/
import java.io.IOException;
public class GetStringByByte
{
public static void main(String[] args) throws IOException
{
String str = "f过好的sd喆dd";
for (int len = 0; len < str.getBytes("gbk").length; len++)
{
System.out.println("截取" + (len + 1) + "个字节的结果是:" + getStringByByte(str, len + 1));
}
}
/**
* 1.先把字符串转换成字节数组(注意字符集"gbk")
* 2.根据要截取的长度,从index=len-1开始,倒序编列数组
* 3.判断每个字节十进制的值
* 4.如果<0,则计数器+1; 循环直到>0
* 5.判断计数器为偶数,则直接截取(0,len)字符串
* 6.若果计数器为奇数,则截取(0,len-1)字符串
*
* @param str 要截取的字符串
* @param len 要截取的长度
* @return 截取后的字符串
* @throws IOException
*/
private static String getStringByByte(String str, int len) throws IOException
{
byte[] b = str.getBytes("gbk");
int count = 0;
for (int i = len - 1; i >= 0; i--)
{
if (b[i] < 0)
count++;
else
break;
}
if (count % 2 == 0)
return new String(b, 0, len, "gbk");
else
return new String(b, 0, len - 1, "gbk");
}
}