本帖最后由 段光宇 于 2013-11-16 23:58 编辑
结合一位黑马前辈的代码,终于理解了意思心得体会:之前自己在想的时候,只想到了截取办法,后来知道截取长度末尾正好在汉字的一个字节上,那么输出时汉字便会不完整 ,那么就可以采用在字节数组中忽略汉字占的位数既可以实现。- package com.itheima;
- import java.io.*;
- /*编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表)
- 例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文
-
- 思路:要在字符串中按字符串截取一部分,先要将字符串转为字节形式,根据单汉字的字节为2的特点,
- 如果截取长度末尾正好在汉字的一个字节上,那么输出时汉字便会不完整,可以在字节数组中将汉字的一个字符忽略掉,
- 便不会存在输出中文字符不完整的问题,可以输出完整的字符串
- * */
- class Test10{
- public static void main(String[] args){
- substr("HM程序员", 3);
- }
- public static void substr(String str , int l){//定义截取函数,参数为(字符串,截取字节长度)
- String s = null; //定义字符串s初始化为空
- if(str == null){
- System.out.println("字符串为空");
- }
- else{
- byte[] bt = null; //初始化字节数组bt为空
- try {
- bt = str.getBytes("GBK"); //将字符串使用GBK编码转化为字节数组
- }
- catch (UnsupportedEncodingException e){
- e.printStackTrace();
- }
- if(bt.length <= l){
- s = str;
- }//若字节数组长度小于要求的截取字节长度,则字符串s仍为原字符串str
- if(l > 0){
- s = new String(bt, 0, l); //根据截取字节长度从字符数组中解码,生成新的字符串s。
- int length = s.length(); //得到新字符串s长度
- if(str.charAt(length - 1) != s.charAt(length-1)){//如果原字符串中相应位置上的字符与新字符串相应位置上的字符不相等,说明新字符串中相应位置只有半个中文,则应该讲数组指针向左移一位,形成新的子串。
- if(length < 2){
- s = null; //如果新字符串的长度小于2,则将新字符串赋值为空。
- }
- else{
- s = s.substring(0, length - 1); //将符合条件的子串复制给s
- }
- }
- }
- }
- System.out.println(s);
- }
- }
复制代码 |