e_utils/
share.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/// 安全的获取需要的长度
pub fn get_safe_preview(content: impl Into<String>, max_length: usize) -> String {
  let content: String = content.into();
  if content.len() <= max_length {
    // 如果原始字符串长度小于等于最大长度,直接返回原始字符串
    content
  } else {
    // 获取前max_length个字符
    let mut preview_chars = content.chars().take(max_length);
    let mut preview: String = preview_chars.by_ref().collect(); // 将字符收集成字符串

    // 如果最后一个字符是部分字符,则移除它
    while let Some(last_char) = preview.chars().last() {
      if !content.chars().skip(max_length - 1).next().unwrap_or('\0').eq(&last_char) {
        // 移除最后一个字符
        preview.pop();
      } else {
        break;
      }
    }

    preview
  }
}
/// 安全的获取需要的长度
pub fn get_safe_preview_bytes(content: &[u8], max_length: usize) -> Vec<u8> {
  if content.is_empty() {
    return Vec::new();
  }
  if content.len() <= max_length {
    // 如果原始字节长度小于等于最大长度,直接返回原始字节数组
    content.to_vec()
  } else {
    // 获取前max_length个字节,使用安全的切片操作
    let preview_slice = &content.get(..max_length.min(content.len())).unwrap_or_default();
    if preview_slice.is_empty() {
      return Vec::new();
    }
    let mut preview = preview_slice.to_vec();
    // 处理可能被截断的UTF-8字符
    while !preview.is_empty() {
      if let Ok(_) = std::str::from_utf8(&preview) {
        break;
      }
      preview.pop();
    }

    preview
  }
}