在指定编码环境下,按给定字节数截取字符串问题

1、题目描述

在GBK编码环境下,编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。但是要保证汉字不被截半个,如"我ABC"4,应该截为"我AB",输入"我ABC汉DEF",6,应该输出为"我ABC"而不是"我ABC+汉的半个"。

2、解决代码

 public static String subString(String str, int splitByteNum) throws UnsupportedEncodingException
        {
            //输入无效判断
            if (null == str || "".equals(str) || splitByteNum <= 0)
            {
                return "";
            }

            int tempSubStrLength = splitByteNum;
            //截取长度为要截取字节数的子串。说明str.length()字符串中字符个数一定小于等于字节数。
            String subStr = str.substring(0, tempSubStrLength > str.length() ? str.length() : tempSubStrLength);
            //在GBK编码下,得到子串的字节长度
            int subStrByteNum = subStr.getBytes("GBK").length;
            
            //如果子串的字节长度大于字符长度,说明一定有汉字
            while (subStrByteNum > tempSubStrLength)
            {
                /**
                 * 在子串末尾去掉一个字符,重新计算子串在GBK下的字节长度。
                 * 因为是去掉一个字符,而汉字占一个字符,所以不用考虑半个汉字的问题
                 */
                int subStrLength = --splitByteNum;
                subStr = str.substring(0, tempSubStrLength > str.length() ? str.length() : subStrLength);
                subStrByteNum = subStr.getBytes("GBK").length;
            }

            return subStr;
        }

参考文章:http://songjianyong.iteye.com/blog/1399241

你可能感兴趣的:(在指定编码环境下,按给定字节数截取字符串问题)