JAVA中:中英文混合的字符串按字节截取问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA中:中英文混合的字符串按字节截取问题相关的知识,希望对你有一定的参考价值。

现有一个很长中的英文混合的字符串(假如个数有两千万),怎么高效率的取左边10000个或者50000个字节的字符串?

如果一个一个取出再算长度实在太慢了。

我的QQ是 272867141 昵称是:浪迹天涯
String str="a中c国d人w";
str.subString(0,3);这个方法是按个数截取的,不是按字节截取的。

可以写个小的算法,每次取这个范围内的字符判断,然后再取一半根据大小判断.
比如:10000个可以先用substring截7500个字符(最少5000,最多10000,取一半),然后根据字节数大小,再按一半的方式进行截(如果比10000字节少,就取5000-7500中间的 ,如果多,就取7500-10000),依次类推就可以了,直到取得结果.

这样应该是次数最少的了
参考技术A 楼上的同志们说的都有道理,你可以不这样处理字符串,可以把字符串变成一个个的字符数组来处理。String自带toCharArray()方法,可以自行转换,这样处理起来可以得心应手。
其实在做Java编程的时候,不要啃住一个骨头不放,方法是灵活的,思路更是灵活的,实际情况也是多变的。就像你说的一个长达几万字符的截取,就不会再用String去做了,这样不仅没有效率,而且你会发现程序冗长无力。实际上,没有人会去做截取这么长的字符串工作。

多多看高人写的程序,提高会很快的~
祝你成功~
参考技术B 字符编码不同,一个汉字的字节数可能会有不同,所以实现这个程序困难不小。

比如,UTF8 and UTF16编码的字符字节数不是相同的。

实在看不出楼主的用意,假如你取到的第10000个字节刚好是中文字符编码的低位,转变成中文不就乱码了?又或是三字节的,你刚好取到两字节,这又会是乱码。

算了,我也不F话了,直接上java.nio.ByteBuffer+java.nio.channels.Channel来处理吧。
这个超快,不会找DOC。

附:
如果你愿意快速处理字符串,建议用StringBuffer来处理,在处理超大字符串时,程序会有意想不到的速度提升。 过百万字节的字符串如过用String.substring()来处理是超慢的。呵呵
参考技术C 字符串有截取方法呀。。。。。
字符长度受你内存大小的影响~~~
String str="abc...";这样定义的字符串是存在字符串池中的
String str=new String("abc...")这样定义的字符串是在堆内存中的,然后 被栈内存的对象str引用
所以字符串是对象,是在内存中存储的,不像基本数据类型有各自的长度,字符串应该是只要是内存不满,是没有长度限制的
substring方法
String a="awdadadada342342424242424242424242";
String first10000=a.substring(0,9999);
String end10000=a.substring(a.length-9999);
希望能帮到你!!
参考技术D public class Tools
public Tools()

/**
* 字符串按字节截取
* @param str 原字符
* @param len 截取长度
* @return String
* @author kinglong
* @since 2006.07.20
*/
public static String splitString(String str, int len)
return splitString(str, len, "...");


/**
* 字符串按字节截取
* @param str 原字符
* @param len 截取长度
* @param elide 省略符
* @return String
* @author kinglong
* @since 2006.07.20
*/
public static String splitString(String str,int len,String elide)
if (str == null)
return "";

byte[] strByte = str.getBytes();
int strLen = strByte.length;
int elideLen = (elide.trim().length() == 0) ? 0 : elide.getBytes().length;
if (len >= strLen || len < 1)
return str;

if (len - elideLen > 0)
len = len - elideLen;

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 + 1 : len - 1;

return new String(strByte, 0, len) + elide.trim();

Java 按字节计算字符串的长度

   在《从后向前截取指定长度的字符串》中介绍了如何截取字符串,本文介绍如何统计字符串的字节长度。
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.UnsupportedEncodingException;


public class GetLength {
    private static final Logger logger = LoggerFactory.getLogger(GetLength.class);


    // 编码方式
    private static final String ENCODE_UTF = "UTF-8";


    /**
     * 计算中英文字符串的字节长度 <br/>
     * 一个中文占3个字节
     *
     * @param str
     * @return int 字符串的字节长度
     */
    public static int getLength(String str) {
        if (str == null || str.length() == 0) {
            return 0;
        }
        try {
            return str.getBytes(ENCODE_UTF).length;
        } catch (UnsupportedEncodingException e) {
            logger.error("计算中英文字符串的字节长度失败,", e);
        }
        return 0;
    }




    /**
     * 计算中英文字符串的字节长度
     *
     * @param str
     * @return int
     */
    public static int getStrLength(String str) {
        if (str == null || str.length() == 0) {
            return 0;
        }
        int len = 0;
        for (int i = 0, j = str.length(); i < j; i++) {
            //UTF-8编码格式中文占三个字节,GBK编码格式 中文占两个字节 ;
            len += (str.charAt(i) > 255 ? 3 : 1);
        }
        return len;
    }


    public static void main(String[] args) {
        String str = "农业银行 3Wiener,支付密";
        System.out.println(getLength(str));
        System.out.println(getStrLength(str));
    }
    
}

 

 

以上是关于JAVA中:中英文混合的字符串按字节截取问题的主要内容,如果未能解决你的问题,请参考以下文章

java,要实现字符串按字节截取的方法

java 按字节截取字符串问题

java按给定字节数截取含有中英文的字符串

用java 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。但是要保

【急求】java 按字节截取字符串,从指定的位置开始,到指定的位置结束

java字符串按字节补空问题