您的位置:首页 > 其它

截取指定长度的字符串(汉字不出现半个)

2014-07-15 22:56 489 查看
/**
 * 定义一个方法,按照指定的长度截取字符.
 * 如:对于"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");
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: