Mit dem abschneiden von Strings von Bytes
Erstelle ich die folgenden für das abschneiden einer Zeichenfolge in java, um eine neue Zeichenfolge mit einer bestimmten Anzahl von bytes.
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;
Dies ist die erste Sache, die mir in den Sinn kam, und ich weiß, dass ich verbessern könnte. Ich sah in einem anderen Beitrag wurde gefragt, eine ähnliche Frage gibt, aber Sie waren mit dem abschneiden von Strings mit bytes anstelle von String.substring. Ich glaube, ich würde eher die Verwendung von String.substring in meinem Fall.
EDIT: habe Sie gerade entfernt die UTF8-Referenz würde ich da eher in der Lage sein, dies zu tun für unterschiedliche storage-Typen aswell.
- Ich würde das anders formulieren Ihr problem. Sie versuchen zu passen, einen string in ein byte-array, das nicht größer als maxUTF8BytesLength. Sie wollen für die Verwendung von UTF-8 für die Codierung. Sie kopieren wollen so viel Charakter wie möglich. Richtig?
- richtig, ich würde sagen, dass ist richtig. Ich möchte auch, es zu tun effizient.
- Ich habe gerade bearbeiteten die Frage nicht auf UTF-8. Tut uns Leid, es war irreführend.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Warum nicht konvertieren in bytes und geht voran--gehorchen UTF8-Zeichen Grenzen, wie Sie es tun-bis Sie haben die maximale Anzahl, dann konvertieren Sie diese bytes wieder in einen string?
Oder Sie könnten nur ein Ausschneiden der original-string, wenn Sie verfolgen, wo der Schnitt auftreten sollten:
Hinweis: bearbeitet werden, um Fehler zu beheben, auf 2014-08-25
Den vernünftigeren Lösung mit decoder:
Ich denke, Rex Kerr-Lösung hat 2 bugs.
Bitte meine korrigierte version unten:
Dachte ich noch, das war weit aus effektiver. Also, wenn Sie nicht wirklich brauchen, die String-Darstellung des Ergebnis-und das byte-array haben, können Sie dieses verwenden:
Lustige an der Sache ist, dass mit einer realistischen 20-500 byte-Grenze, die Sie ausführen, so ziemlich das gleiche WENN erstellen Sie einen string aus dem byte-array wieder.
Bitte beachten Sie, dass beide Methoden gehen von einem gültigen utf-8-Eingabe ist eine gültige Annahme, nach der Verwendung von Java mit der getBytes () - Funktion.
Verwenden Sie die UTF-8 CharsetEncoder und codieren bis der Ausgang ByteBuffer enthält so viele bytes, wie Sie bereit sind zu nehmen, von der Suche nach CoderResult.OVERFLOW.
Zweite Ansatz funktioniert hier gut
http://www.jroller.com/holy/entry/truncating_utf_string_to_the
Wie bereits erwähnt, Peter Lawrey Lösung hat großen performance-Nachteil (~3,500 msc für 10.000 mal), Rex Kerr war viel besser (~500msc für 10.000 mal), aber das Ergebnis nicht korrekt war - es Schnitt weit mehr, als es benötigt (statt der verbleibenden 4000 bytes es remainds 3500 für einige Beispiele). attached hier ist meine Lösung (~250msc für das 10.000-fache) unter der Annahme, dass UTF-8 max Länge char in Byte 4 (danke WikiPedia):
s = new String(s.getBytes("UTF-8"), 0, MAX_LENGTH - 2, "UTF-8");
könnte man konvertieren Sie die Zeichenfolge in bytes umwandeln und nur diese bytes wieder in einen string.
Durch die Verwendung unter Regulärer Ausdruck Sie können auch entfernen Sie führende und nachfolgende Leerzeichen von double-byte-Zeichen.
Dies ist meine :
Diese könnte man nicht die effizientere Lösung, aber Sie funktioniert
Habe ich verbessert Peter Lawrey, der die Lösung für genau handle ersatzzeichenpaare. Darüber hinaus habe ich optimiert, basierend auf der Tatsache, dass die maximale Anzahl von bytes pro
char
im UTF-8-Codierung ist 3.