Усечение строк по байтам

Я создаю следующее для усечения строки в 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, потому что я бы предпочел сделать это и для разных типов хранилищ.

9
задан stevebot 31 January 2013 в 17:04
поделиться

2 ответа

Почему бы не преобразовать в байты и не двигаться вперед, соблюдая границы символов UTF8, пока вы не получите максимальное число, а затем преобразовать эти байты обратно в строку?

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

// Assuming that Java will always produce valid UTF8 from a string, so no error checking!
// (Is this always true, I wonder?)
public class UTF8Cutter {
  public static String cut(String s, int n) {
    byte[] utf8 = s.getBytes();
    if (utf8.length < n) n = utf8.length;
    int n16 = 0;
    int advance = 1;
    int i = 0;
    while (i < n) {
      advance = 1;
      if ((utf8[i] & 0x80) == 0) i += 1;
      else if ((utf8[i] & 0xE0) == 0xC0) i += 2;
      else if ((utf8[i] & 0xF0) == 0xE0) i += 3;
      else { i += 4; advance = 2; }
      if (i <= n) n16 += advance;
    }
    return s.substring(0,n16);
  }
}

Примечание: отредактировано для исправления ошибок 25 августа 2014 г.

13
ответ дан 4 December 2019 в 06:29
поделиться

вы можете преобразовать строку в байты и преобразовать только эти байты обратно в строку.

public static String substring(String text, int maxBytes) {
   StringBuilder ret = new StringBuilder();
   for(int i = 0;i < text.length(); i++) {
       // works out how many bytes a character takes, 
       // and removes these from the total allowed.
       if((maxBytes -= text.substring(i, i+1).getBytes().length) < 0) break;
       ret.append(text.charAt(i));
   }
   return ret.toString();
}
1
ответ дан 4 December 2019 в 06:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: