在flutter中获取包含和emoji的字符串的子字符串可能会导致渲染失败

9udxz4iz  于 2023-01-31  发布在  Flutter
关注(0)|答案(2)|浏览(210)

作为应用程序的一部分,我将用户给定的字符串缩短到40个字符,如果字符串超过40个字符,则在末尾添加省略号。用户可以在字符串中使用表情符号。
如果被切断的字符串在40个字符标记处有一个表情符号,则会导致它无法渲染,并渲染为“"。
有没有一种方法可以可靠地获取文本的子字符串,而不会遇到这个问题?
当前代码:

if (useStr.length > 40) {
useStr = useStr.substring(0, 40) + "...";
}
4ioopgfo

4ioopgfo1#

你可以使用“flutter_string_encoding”库,它提供了显示宽度方面的字符串宽度计算,考虑了像emoji这样的全角字符。

import 'package:flutter_string_encoding/flutter_string_encoding.dart';

String useStr = "user-given string with emoji 🔥";
if (stringWidth(useStr) > 40) {
  useStr = useStr.substring(0, useStr.length - stringWidth(useStr) + 40) + "...";
}
f87krz0w

f87krz0w2#

您应该使用package:characters,并根据graphemes(人类感知的字符)而不是根据(UTF-16)代码单元截断字符串。

import 'package:characters/characters.dart';

void main() {
  final originalString = '\u{1F336}\uFE0F' * 3; // 🌶️🌶️🌶️
  const ellipsis = '\u2026';
  for (var i = 1; i < 4; i += 1) {
    var s = originalString;
    var characters = s.chararacters;
    if (characters.length > i) {
      s = '${characters.take(i)}$ellipsis';
    }
    print(s);
  }
}

其打印:

🌶️…
🌶️🌶️…
🌶️🌶️🌶️

相关问题