本帖最后由 Apol 于 2015-7-25 23:09 编辑
- <div class="blockcode"><blockquote>/**
- 编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表)
- 例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文
- 思路:GBK编码中,一个字母占一个字节,切最高位为0;一个汉字占两个字节,最高位都为为1.
- */
- import java.util.*;
- class Test10
- {
- public static void main(String[] args) throws Exception
- {
- String str = "你好HM程序员";
- //c从str中截取前3个字节,并返回字符串
- String sub = backString(str, 3);
-
- System.out.println(sub);
- }
-
- //取字符创str的前n个字节的字符串
- public static String backString(String str, int n) throws Exception
- {
- //字符串转换为字节数组
- byte[] buf = str.getBytes("GBK");
-
- //存储返回的子串
- String sub = null;
-
- //记录每个字节的最高位
- StringBuilder sb = new StringBuilder(); //
-
- for(byte b : buf)
- {
- String s = Integer.toBinaryString(b&128);
- char[] ch = s.toCharArray();
-
- sb.append(ch[0]);
- }
- //System.out.println(sb);
-
- //第n个字节的最高位
- char c = sb.charAt(n-1);
- //System.out.println(c);
-
- //如果第n个字节最高位为0,则返回前n个字节的字符串
- if(c == '0')
- {
- sub = new String(buf, 0, n, "GBK");
- }
-
- //如果第n个字节最高位为1,则需要记录前n个字节最高位为1的个数count
- //count为偶数,则该字节只是一个中文字符的一部分,只需返回前n-1个字节的字符串形式
- //count为奇数,则第n-1个字节的最高位必也为1,这两个字节正好形成一个中文字符,返回前n个字节的字符串形式
- else
- {
- int count = 0;
- //记录'1'在sb中的第n个字符之前出现的次数
- char[] s1 = sb.toString().toCharArray();
-
- for(int i = 0; i < n-1 ; i++)
- {
- if(s1[i] == '1')
- {
- count++;
- }
- }
-
- if(count%2 == 0)
- {
- sub = new String(buf, 0, n-1, "GBK");
- }
- else
- {
- sub = new String(buf, 0, n, "GBK");
- }
- }
-
- return sub;
-
- }
- }
复制代码
|
|