正对上面一位前辈的程序,小小更改一下,才能真正获得需要的结果
package foo;/**
 * 写一个方法  String left(String str ,int n) str字符串中可能包含中文,中文是2bytes,实现的功能是 
 * 如:“中abc12” n=4  则该方法返回“中ab”  “中abc国a” n=6 则返回“中abc”中文是一半时不返回  
 * @author Fee Share
 *
 */
public class T {
    public static void main(String[] args) {
        String s = "我是acf中d国人adfgdd123";
        System.out.println(getSubString(s, 4));    }    private static String getSubString(String s, int n) {
        int count = 0;
        int offset = 0;
        char[] c = s.toCharArray();
        for (int i = 0; i < c.length; i++) {
            if (c[i] > 256) {
                offset = 2;
                count += 2;
            } else {
                offset = 1;
                count++;
            }
            if (count == n ) {
                return s.substring(0, i+1 );
            }if((count == n + 1 && offset == 2)){
             return s.substring(0,i);
            }
        }
        return null;    }
}

解决方案 »

  1.   

    最后一个 
    return null; 
    应该是
    return "";
      

  2.   

    貌似写错了  看看我的    
       public static void main(String[] args) {
            String s = "我是acf中d国人adfgdd123";
            System.out.println(getSubString(s, 3));     } private static String getSubString(String s, int i) {
    char[] arr=s.toCharArray();
    int m = 0;
    for(int j=0;j<arr.length;j++){
    if(arr[j]>256){
    m++;
    }
    if(m+j==i){
    return s.substring(0, i-m);
    }
    }
    return "";
    }
      

  3.   

    错误是:当n大于字符串长度时,程序会返回null。
    改成下面这样就可以啦public class T {
        public static void main(String[] args) {
            String s = "我是acf中d国人adfgdd123";
            System.out.println(getSubString(s, 4));    }    private static String getSubString(String s, int n) {
            //加上这句话就可以啦
            if(n >= s.length()){
              return s;
            }
            int count = 0;
            int offset = 0;
            char[] c = s.toCharArray();
            for (int i = 0; i < c.length; i++) {
                if (c[i] > 256) {
                    offset = 2;
                    count += 2;
                } else {
                    offset = 1;
                    count++;
                }
                if (count == n ) {
                    return s.substring(0, i+1 );
                }if((count == n + 1 && offset == 2)){
                return s.substring(0,i);
                }
            }
            return null;    }

      

  4.   

    今天看了论坛的一个帖子:关于char的:
    public class NewString {
       
        /**
         *
         * @param str
         * @param n 读取长度
         * @return
         */
        public static String left(String str,int n){
             
            //将String转换为char[]
             char[] chArr = str.toCharArray();  
            
             int i=0,len = 0;
            
             while(i < chArr.length){//计算实际读取的长度 
            
                 if (chArr[i] > 255) //如果是中文
                     
                     len += 2;//长度为2
                
                 else //一般类型
                     
                     len++; 
                
                 if(len > n)//如果大于就退出
                     
                     break;
                
                 i++;
             }
            
             return str.substring(0,i);
        }
       
        public static void main(String[] args){
           
            String str = "df阿飞到了jdsfsd阿飞到了是否快乐";
           
            int n=11 ;
           
            System.out.println(NewString.left(str, n));
           
        }
    }
      

  5.   


        public static String left(String str, int n) {
            char[] c = str.toCharArray();
            for (int i = 0; i < n; i++) {
                if (String.valueOf(c[i]).getBytes().length == 2) {
                    n--;
                }
            }
            return str.substring(0, n);
        }    public static void main(String[] args) {
            String s1 = "中abc12";
            String s2 = "中abc国a";
            System.out.println(T1.left(s2, 6));
        }
      

  6.   

    当n足够大时,会抛出异常的!
    如:System.out.println(T1.left(s2, 100));
      

  7.   


    晕~!判断一下n可字符数谁大谁小先,不就OK吗,不要那么死板 
      

  8.   

    以前我也写个一个。贴出来看看
    public class CutByBytes {    public static void main(String[] args) {
            String str = "短信duanxin短信duanxin贵州guizhou贵州guizhou";
            System.out.println(left(str, 0));
            System.out.println(left(str, 1));
            System.out.println(left(str, 5));
            System.out.println(left(str, 6));
            System.out.println(left(str, 7)); 
            System.out.println(left(str, 8)); 
        }    private static String left(String str, int byte_len) {
            if (str.getBytes().length < byte_len) {
                return str;
            }        String substr = str;
            while (substr.getBytes().length > byte_len) {
                substr = substr.substring(0, substr.length() - 1);
            }
            return substr;
        }
    }
      

  9.   


    public String asc(String a,int n){
    String a="我shi是dfdf*中国人china";
    char[] ch=a.toCharArray();
    int count=0;
    for(int i=0;i<ch.length;i++){
    if(ch[i]>123){
    count=count+2;
    }else{
    count=count+1;
    }
    if(count==n){
    System.out.println(a.substring(0,i+1));
    }else if(count>n){
    System.out.println(a.substring(0,i));
    return;
    }

    }  
    }
      

  10.   


    String a="我shi是一d中国人china";
    byte[] bt=a.getBytes();
    String ss=null;
    if(bt[6]<0){
    ss=new String(a.getBytes(),0,5);
    }else{
    ss=new String(a.getBytes(),0,6);
    }
    System.out.println(ss);突然想到一个更方便的!
      

  11.   

    参考
    String(char[] value, int offset, int count) 
              分配一个新的 String,它包含来自该字符数组参数的一个子数组的字符。可以直接满足要求。当然我始终觉得题目的要求绝对不是让你去调API的
      

  12.   

    public StringBuffer subStr(String s , int index){
    StringBuffer temps= new StringBuffer();
    int temp_end = 0;
    char[] c = s.toCharArray();
    for(char ch: c){
    temp_end=(ch&0xff00)!=0 ? temp_end+2 : temp_end+1;

    if(temp_end>index)
    break;

    temps.append(ch);
    }
    return temps;
    }
      

  13.   

    arr[j]>256:为什么大于256就可判断是汉字啊?