期待されるアプローチString.truncate(usize)
は、Unicode文字を考慮していないため失敗します(これは、Rustが文字列をUnicodeとして扱うと考えると困惑します)。アサーション 'でパニック'文字列をN文字以下で切り詰めるにはどうすればよいですか?
let mut s = "ボルテックス".to_string();
s.truncate(4);
スレッド 'が失敗しました:self.is_char_boundary(new_len)'
はさらに、truncate
は常に望まれていない元の文字列を修正します。
私が考えているのは、char
に変換してString
に集めることです。
fn truncate(s: String, max_width: usize) -> String {
s.chars().take(max_width).collect()
}
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");
}
しかし、これは非常に重い手渡しを感じます。
ユニコードは複雑です。 'char'(コードポイントに対応する)を単位とし、書記素クラスタではないと確信していますか? – delnan
実際には、他の方向も有効です。UTF-8エンコーディングにかかるバイト数に制限を設けます。文字全体を切り捨てるように注意してください。—可能な限り多くの 'char'sを取りますNバイト)。これは人の文字数の認識とは一致しませんが、制限がストレージ動機付けされている場合(データベース列のサイズなど)は妥当です。 – delnan