Abschneiden von Strings nach Bytes

8

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.

    
stevebot 26.08.2010, 15:38
quelle

12 Antworten

11

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 beheben     
Rex Kerr 26.08.2010, 15:46
quelle
5

Die sinnvollere Lösung ist die Verwendung eines Decoders:

%Vor%     
kan 05.08.2015 09:17
quelle
5

Ich denke, die Lösung von Rex Kerr hat zwei Fehler.

  • Zuerst wird es abgeschnitten, um + 1 zu begrenzen, wenn ein Nicht-ASCII-Zeichen gerade vor dem Limit ist. Das Abschneiden von "123456789á1" führt zu "123456789á", das in UTF-8 in 11 Zeichen dargestellt wird.
  • Zweitens glaube ich, dass er den UTF-Standard falsch interpretiert hat. Ссылка zeigt, dass ein 110xxxxx am Anfang einer UTF-Sequenz uns mitteilt, dass die Darstellung 2 Zeichen lang ist ( im Gegensatz zu 3). Das ist der Grund, warum seine Implementierung normalerweise nicht den gesamten verfügbaren Platz verbraucht (wie Nissim Avitan bemerkte).

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.

    
Zsolt Taskai 27.07.2013 01:26
quelle
3

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.

    
bmargulies 24.04.2011 21:11
quelle
3

Second Approach funktioniert hier gut Ссылка

    
shadow 02.12.2011 09:45
quelle
2

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%     
Nissim Avitan 31.01.2013 09:54
quelle
1

Sie könnten die Zeichenfolge in Bytes konvertieren und nur diese Bytes in eine Zeichenfolge zurückkonvertieren.

%Vor%     
Peter Lawrey 27.08.2010 21:51
quelle
0

s = new String(s.getBytes("UTF-8"), 0, MAX_LENGTH - 2, "UTF-8");

    
0x100 23.05.2013 14:39
quelle
0

Durch Verwendung von unter Regulärer Ausdruck können Sie auch vorangestelltes und nachstehendes Leerraum von Doppelbyte-Zeichen entfernen.

%Vor%     
Gokul Limbe 06.01.2014 08:52
quelle
0

Das ist mein:

%Vor%     
quelle
0

Dies könnte nicht die effizientere Lösung sein, aber funktioniert

%Vor%     
Saúl Martínez Vidals 06.02.2015 06:14
quelle
0

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.

%Vor%     
Hans Brende 10.12.2016 01:27
quelle

Tags und Links