Der erwartete Ansatz von String.truncate(usize)
schlägt fehl, weil Unicode-Zeichen nicht berücksichtigt werden (was verwirrend ist, wenn man bedenkt, dass Rust Zeichenketten als Unicode behandelt).Wie kann ich eine Zeichenfolge abschneiden, um maximal N Zeichen zu haben?
let mut s = "ボルテックス".to_string();
s.truncate(4);
Faden 'Behauptung' bei Panik geraten 'fehlgeschlagen: self.is_char_boundary (new_len)'
Zusätzlich truncate
modifiziert das Original-Zeichenkette, die nicht immer erwünscht ist.
Das Beste, was ich habe, ist zu char
s konvertieren und in eine String
sammeln.
fn truncate(s: String, max_width: usize) -> String {
s.chars().take(max_width).collect()
}
z.B.
fn main() {
assert_eq!(truncate("ボルテックス".to_string(), 0), "");
assert_eq!(truncate("ボルテックス".to_string(), 4), "ボルテッ");
assert_eq!(truncate("ボルテックス".to_string(), 100), "ボルテックス");
assert_eq!(truncate("hello".to_string(), 4), "hell");
}
Allerdings fühlt sich das sehr schwer an.
Unicode ist verdammt kompliziert. Sind Sie sicher, dass Sie 'char' (was Codepunkten entspricht) als Einheit und nicht als Graphem-Cluster verwenden möchten? – delnan
Tatsächlich ist die andere Richtung genauso gültig: Setzen Sie eine Grenze für die Anzahl * Bytes *, die die UTF-8-Kodierung benötigt (Sie müssen einige Zeichen entfernen, um ganze Zeichen zu entfernen.) — nehmen Sie so viele Zeichen wie möglich N Bytes). Dies entspricht zwar nicht der Wahrnehmung von Charakterzählungen durch Menschen, ist jedoch sinnvoll, wenn die Einschränkung speichermotiviert ist (z. B. die Größe einer Datenbankspalte). – delnan