java:关于字符编码的试题

来源:互联网 发布:仙6steam mac 编辑:程序博客网 时间:2024/05/21 04:22
<pre name="code" class="java">/** 编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表)        例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文<span style="white-space:pre"></span>思路: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;                }}


                                             
0 0
原创粉丝点击