问一个关于字符串处理的算法

写一个方法,要求按照指定的字节数来截取字符串,注意:如果最后截取的是半个汉字的话,就舍去

如:"abc是123",截取4个字节,结果是"abc",截取5个字节,结果是"abc是"

[quote]
public void subString(String str,int ind){

    byte[] bs = str.getBytes();   

    String result = "";   

    int count = 0;   

    if(str.length() > 0 && ind != 0 ){   
        //计数器   
        for(int i = 0 ; i <= ind - 1;i++){   
            if(bs[i]<0) {   
                count++;   
            }   
        }   
        System.out.println("count: " + count);   

        //截取一般汉字时必定为奇数,并且为负数。截取字符前进一。   
        if(bs[ind] < 0 && (count%2) != 0 ){   
            String temp = new String( bs,0,ind-1);   
            System.out.println("截取后的:" + temp);   
        }else{   
            String temp = new String( bs,0,ind);   
            System.out.println("正好不用截取的:" + temp);   
        }   
    }  

[/quote]

按字节数截取字符串子串?
1.字符串应该用某种编码转换成字节流
2.每个字符在各种编码下的字节数不相同
3.所以...

汉字编码中现在主要用到的有三类,包括GBK,GB2312和Big5。

1、GB2312又称国标码,由国家标准总局发布,1981年5月1日实施,通行于大陆。新加坡等地也使用此编码。它是一个简化字的编码规范,当然也包括其他的符号、字母、日文假名等,共7445个图形字符,其中汉字占6763个。我们平时说6768个汉字,实际上里边有5个编码为空白,所以总共有6763个汉字。

  GB2312规定“对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示”,习惯上称第一个字节为“高字节”,第二个字节为“低字节”。GB2312中汉字的编码范围为,第一字节0xB0-0xF7(对应十进制为176-247),第二个字节0xA0-0xFE(对应十进制为160-254)。

GB2312将代码表分为94个区,对应第一字节(0xa1-0xfe);每个区94个位(0xa1-0xfe),对应第二字节,两个字节的值分别为区号值和位号值加32(2OH),因此也称为区位码。01-09区为符号、数字区,16-87区为汉字区(0xb0-0xf7),10-15区、88-94区是有待进一步标准化的空白区。



   2、Big5又称大五码,主要为香港与台湾使用,即是一个繁体字编码。每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE(即129-255),共126种。第二个字节的范围不连续,分别为0X40-0X7E(即64-126),0XA1-0XFE(即161-254),共157种。



3、GBK是GB2312的扩展,是向上兼容的,因此GB2312中的汉字的编码与GBK中汉字的相同。另外,GBK中还包含繁体字的编码,它与Big5编码之间的关系我还没有弄明白,好像是不一致的。GBK中每个汉字仍然包含两个字节,第一个字节的范围是0x81-0xFE(即129-254),第二个字节的范围是0x40-0xFE(即64-254)。GBK中有码位23940个,包含汉字21003个。



                               表1 汉字编码范围

名称
第一字节
第二字节

GB2312
0xB0-0xF7(176-247)
0xA0-0xFE(160-254)

GBK
0x81-0xFE(129-254)
0x40-0xFE(64-254)

Big5
0x81-0xFE(129-255)
0x40-0x7E(64-126)

0xA1-0xFE(161-254)

你截取之前,对要截取的最后一个字符的编码进行判断
如果这个字符是汉字的话,那很可能是汉字的第一字节,根据下表分析一下是不是汉字就可以了
名称 第一字节 第二字节

GB2312 0xB0-0xF7(176-247) 0xA0-0xFE(160-254)

GBK 0x81-0xFE(129-254) 0x40-0xFE(64-254)

Big5 0x81-0xFE(129-255) 0x40-0x7E(64-126) 0xA1-0xFE(161-254)