e_utils/
share.rs

1/// 安全的获取需要的长度
2pub fn get_safe_preview(content: impl Into<String>, max_length: usize) -> String {
3  let content: String = content.into();
4  if content.len() <= max_length {
5    // 如果原始字符串长度小于等于最大长度,直接返回原始字符串
6    content
7  } else {
8    // 获取前max_length个字符
9    let mut preview_chars = content.chars().take(max_length);
10    let mut preview: String = preview_chars.by_ref().collect(); // 将字符收集成字符串
11
12    // 如果最后一个字符是部分字符,则移除它
13    while let Some(last_char) = preview.chars().last() {
14      if !content.chars().skip(max_length - 1).next().unwrap_or('\0').eq(&last_char) {
15        // 移除最后一个字符
16        preview.pop();
17      } else {
18        break;
19      }
20    }
21
22    preview
23  }
24}
25/// 安全的获取需要的长度
26pub fn get_safe_preview_bytes(content: &[u8], max_length: usize) -> Vec<u8> {
27  if content.is_empty() {
28    return Vec::new();
29  }
30  if content.len() <= max_length {
31    // 如果原始字节长度小于等于最大长度,直接返回原始字节数组
32    content.to_vec()
33  } else {
34    // 获取前max_length个字节,使用安全的切片操作
35    let preview_slice = &content.get(..max_length.min(content.len())).unwrap_or_default();
36    if preview_slice.is_empty() {
37      return Vec::new();
38    }
39    let mut preview = preview_slice.to_vec();
40    // 处理可能被截断的UTF-8字符
41    while !preview.is_empty() {
42      if let Ok(_) = std::str::from_utf8(&preview) {
43        break;
44      }
45      preview.pop();
46    }
47
48    preview
49  }
50}