Ich erstelle Folgendes, um eine Zeichenfolge in Java auf eine neue Zeichenfolge mit einer bestimmten Anzahl von Bytes abzuschneiden.
%Vor%Dies ist das erste, was mir in den Sinn kam, und ich weiß, dass ich es verbessern könnte. Ich sah einen anderen Beitrag, der dort eine ähnliche Frage stellte, aber sie schnitten Strings mit den Bytes statt Stringstring ab. Ich denke, ich würde lieber Stringstring in meinem Fall verwenden.
EDIT: Ich habe gerade die UTF8-Referenz entfernt, weil ich das lieber auch für andere Speichertypen machen könnte.
Warum nicht in Bytes konvertieren und vorwärts gehen - dabei UTF8-Zeichengrenzen einhalten -, bis Sie die maximale Zahl haben, und diese Bytes dann in eine Zeichenfolge zurückkonvertieren?
Oder Sie könnten einfach die ursprüngliche Zeichenfolge abschneiden, wenn Sie verfolgen, wo der Schnitt erfolgen soll:
%Vor%Hinweis: bearbeitet, um Fehler am 2014-08-25
zu behebenIch denke, die Lösung von Rex Kerr hat zwei Fehler.
Bitte finden Sie meine korrigierte Version unten:
%Vor%Ich dachte immer noch, das sei alles andere als effektiv. Wenn Sie also die String-Repräsentation des Ergebnisses nicht wirklich brauchen und das Byte-Array dies tut, können Sie folgendes verwenden:
%Vor%Lustig ist, dass sie mit einer realistischen 20- bis 500-Byte-Grenze ziemlich genau die gleiche IF ausführen, die Sie erneut eine Zeichenfolge aus dem Byte-Array erstellen.
Bitte beachten Sie, dass beide Methoden eine gültige utf-8-Eingabe voraussetzen, die eine gültige Annahme nach Verwendung der Java-Funktion getBytes () ist.
Verwenden Sie den UTF-8 CharsetEncoder, und codieren Sie, bis der ByteBuffer-Ausgang so viele Bytes enthält, wie Sie bereit sind zu nehmen, indem Sie nach CoderResult.OVERFLOW suchen.
Wie bereits erwähnt, hat die Lösung von Peter Lawrey einen großen Leistungsnachteil (~ 3.500msc für 10.000 mal), Rex Kerr war viel besser (~ 500msc für 10.000 mal), aber das Ergebnis war nicht genau - es schnitt viel mehr als nötig von verbleibenden 4000 Bytes bleibt es 3500 für ein Beispiel). hier angehängt meine Lösung (~ 250msc für 10.000 mal) unter der Annahme, dass UTF-8 maximale Länge char in Bytes ist 4 (Danke WikiPedia):
%Vor%Sie könnten die Zeichenfolge in Bytes konvertieren und nur diese Bytes in eine Zeichenfolge zurückkonvertieren.
%Vor%Durch Verwendung von unter Regulärer Ausdruck können Sie auch vorangestelltes und nachstehendes Leerraum von Doppelbyte-Zeichen entfernen.
%Vor%Dies könnte nicht die effizientere Lösung sein, aber funktioniert
%Vor% Ich habe die Lösung von Peter Lawrey verbessert, um Ersatzpaare korrekt zu behandeln. Außerdem habe ich basierend auf der Tatsache optimiert, dass die maximale Anzahl von Bytes pro char
in der UTF-8-Codierung 3 ist.