上午头儿说了,String getSubStr(String str,int length);中的指定长度可以看成是纯的中文或英文的长度。
那么当英文和中文混合时,比如“我love love 你”,按这个长度截完以后,得到新串的自己长度肯定比2*length小,这样的话,我们就需要把少的字节数给它补上,请问该怎么补啊,不能把英文从中间截开,也不能产生中文乱码,举例:“我love love 你”
  如果length=5,则得到的字符为“我love”,此时得到新串的字节长度为6,此时我就应该给它补齐到十个字节,因此后面应该添上“ love”;

解决方案 »

  1.   


    /**
         * 判断一个字符是Ascill字符还是其它字符(如汉,日,韩文字符)
         * 
         * @param char
         *            c, 需要判断的字符
         * @return boolean, 返回true,Ascill字符
         */
        public static boolean isLetter(char c) {
            int k = 0x80;
            return c / k == 0 ? true : false;
        }    /**
         * 得到一个字符串的长度,显示的长度,一个汉字或日韩文长度为2,英文字符长度为1
         * 
         * @param String
         *            s ,需要得到长度的字符串
         * @return int, 得到的字符串长度
         */
        public static int length(String s) {
            if (s == null)
                return 0;
            char[] c = s.toCharArray();
            int len = 0;
            for (int i = 0; i < c.length; i++) {
                len++;
                if (!isLetter(c[i])) {
                    len++;
                }
            }
            return len;
        }    /**
         * 截取一段字符的长度,不区分中英文,如果数字不正好,则少取一个字符位
         * 
         * @author patriotlml
         * @param String
         *            origin, 原始字符串
         * @param int
         *            len, 截取长度(一个汉字长度按2算的)
         * @return String, 返回的字符串
         */
        public static String substring(String origin, int len) {
            if (origin == null || origin.equals("")||len<1)
                return "";
            byte[] strByte = new byte[len];
            if (len > MyUtil.length(origin)){
                return origin;}
            System.arraycopy(origin.getBytes(), 0, strByte, 0, len);
            int count = 0;
            for (int i = 0; i < len; i++) {
                int value = (int) strByte[i];
                if (value < 0) {
                    count++;
                }
            }
            if (count % 2 != 0) {
                len = (len == 1) ? ++len : --len;
            }
            return new String(strByte, 0, len);
        }
    用法:
     string str=MyUtil.substring(lml,14);
     System.out.println(str);
      

  2.   

    楼主真是辛苦了,光这个问题就发了3个100分的帖子,呵呵。关于你的这种需求,做到精确控制确实挺难的,可以分析下你需求,你现在要补齐10个字符,现在后面都是英文字符,可能还好办,但是万一是“我ve”这种形式呢?我不知道你的这个方法是要放到什么地方去应用,但是如果是处理一些网页上的文章标题,那真不如用CSS去控制,省事儿而且高效。当然了,对于你这个问题有个简单的办法,就是求的当前截出来的字符串长度,去原字符串中做减法,比如你原字符串是"abcdef",而你第一次截出来的字符串是"ab",你现在要补上"c",你可以用String类的subString方法来得到"cdef",然后再去截取"c"。
      

  3.   

    字符串中一个汉字占三个字节,jdk1.6
      

  4.   

    重新给一个接口吧,public String getString(byte[] bytestr);目的是把字节变成字符串,要求:中文不要产生乱码,如果有英文字母的话,在句中则保留,在句末
    删除,
      

  5.   

    具体到某一编码后,一个英文字母和一个中文占用大小是一样的(例,java的编码是双字节的)
      
    "abcde".length() ==5
    "画蛇填足了".length() ==5
    只是这个长度的单位是2bytes ,String类中的其它方法也是按此规则的(双字节编码),直接用好了
      

  6.   

    问一个问题,我有一个byte数组,我要将它转成字符串,我如何控制,才能不让它在最后一位产生乱码
    ,肯定是判断byte数组的最后一位吧,如何判断呢
      

  7.   

    gbk编码下,可以判断最高位为1的byte的个数,如果个数为奇数,那就删吧。
      

  8.   


    package test; class SplitString 

      String SplitStr; 
      int SplitByte;   public SplitString(String str,int bytes) 
      { 
       SplitStr=str; 
       SplitByte=bytes; 
       System.out.println("The String is:′"+SplitStr+"′;SplitBytes="+SplitByte); 
      }   public void SplitIt() 
     { 
      int loopCount;   loopCount=(SplitStr.length()%SplitByte==0)?(SplitStr.length()/SplitByte):(SplitStr.length()/SplitByte+1); 
      System.out.println("Will Split into "+loopCount); 
      for (int i=1;i<=loopCount ;i++ ) 
      { 
       if (i==loopCount){ 
       System.out.println(SplitStr.substring((i-1)*SplitByte,SplitStr.length())); 
      } else { 
       System.out.println(SplitStr.substring((i-1)*SplitByte,(i*SplitByte))); 
      } 
     } 

    public static void main(String[] args) 

    SplitString ss = new SplitString("test中dd文dsaf中男大3443n中国43中国人 0ewldfls=103",4); 
    ss.SplitIt(); 

    } 可以参考下...
      

  9.   

    程序写的挺好的,但是在len=1时产生异常,并且如果是中英文混杂的话,在截取时不能保留整个单词