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