Усечение строк в байтах - PullRequest
       10

Усечение строк в байтах

8 голосов
/ 26 августа 2010

Я создаю следующее для усечения строки в Java до новой строки с заданным количеством байтов.

        String truncatedValue = "";
        String currentValue = string;
        int pivotIndex = (int) Math.round(((double) string.length())/2);
        while(!truncatedValue.equals(currentValue)){
            currentValue = string.substring(0,pivotIndex);
            byte[] bytes = null;
            bytes = currentValue.getBytes(encoding);
            if(bytes==null){
                return string;
            }
            int byteLength = bytes.length;
            int newIndex =  (int) Math.round(((double) pivotIndex)/2);
            if(byteLength > maxBytesLength){
                pivotIndex = newIndex;
            } else if(byteLength < maxBytesLength){
                pivotIndex = pivotIndex + 1;
            } else {
                truncatedValue = currentValue;
            }
        }
        return truncatedValue;

Это первое, что пришло мне в голову, и я знаю, что могу улучшить это. Я видел другой пост, где задавался похожий вопрос, но они обрезали строки, используя байты вместо String.substring. Я думаю, что я предпочел бы использовать String.substring в моем случае.

РЕДАКТИРОВАТЬ: Я только что удалил ссылку на UTF8, потому что я бы предпочел сделать это для различных типов хранения.

Ответы [ 12 ]

0 голосов
/ 06 января 2014

Используя нижеприведенное регулярное выражение, вы также можете удалить начальные и конечные пробелы двухбайтовых символов.

stringtoConvert = stringtoConvert.replaceAll("^[\\s ]*", "").replaceAll("[\\s ]*$", "");
0 голосов
/ 29 октября 2013

Это мое:

private static final int FIELD_MAX = 2000;
private static final Charset CHARSET =  Charset.forName("UTF-8"); 

public String trancStatus(String status) {

    if (status != null && (status.getBytes(CHARSET).length > FIELD_MAX)) {
        int maxLength = FIELD_MAX;

        int left = 0, right = status.length();
        int index = 0, bytes = 0, sizeNextChar = 0;

        while (bytes != maxLength && (bytes > maxLength || (bytes + sizeNextChar < maxLength))) {

            index = left + (right - left) / 2;

            bytes = status.substring(0, index).getBytes(CHARSET).length;
            sizeNextChar = String.valueOf(status.charAt(index + 1)).getBytes(CHARSET).length;

            if (bytes < maxLength) {
                left = index - 1;
            } else {
                right = index + 1;
            }
        }

        return status.substring(0, index);

    } else {
        return status;
    }
}
...