我想在flutter中修剪文本,但文本可能有表情符号和其他特殊字符,正常的修剪方法会导致应用程序崩溃(文本小部件无法解释结果)
例子Text(
trim("testsomethin la ba kalom 😊😊😊", 28),
style: TextStyle(
fontSize: Dimen.mediumText,
),
overflow: TextOverflow.ellipsis,
),
我对字符串进行了硬编码,但在现实世界中,它是用户生成的文本(比如聊天系统),因此我们收到了很多崩溃。
只要运行上面的命令,你就会遇到崩溃。
在其他语言中,例如php
,可以做多字节字符串修剪,通过像
$userText = "testsomethin la ba kalom 😊😊😊";
$trimed = mb_substr(
$userText,
0,
min(28, strlen($userText))
);
这是我现在的修剪实现
class FormatMixin {
trim(String s, int trimLength) {
return '${s.substring(0, s.length <= trimLength ? s.length : trimLength)}${s.length <= trimLength ? '' : '...'}';
}
}
我如何修剪包含特殊字符的文本,表情符号,utf-16文本基本上在dart/flutter ?
我将在预期结果下面给出测试用例,用于自定义mbTrim
函数:
text = "testme😊socool😊abc"
1. mbTrim(text, 6) = "testme"
2. mbTrim(text, 7) = "testme😊"
3. mbTrim(text, 8) = "testme😊s"
所以逻辑是,如果发现特殊字符,则需要完全包含或排除它。(这正是php在服务器端所能做的)
有一个字符包来处理字符串而不破坏表情符号。
您的mbtrim
示例可以实现为:
String mbtrim(String text, int length) =>
text.characters.take(length).toString();
对于许多像上面这样的简单任务,Characters
(通过.characters
)是足够的。
CharacterRange
类。如果你在循环中做一些复杂的事情,通过更新CharacterRange
而不是使用索引来完成通常是更方便和有效的,所以尝试看看你是否可以使用CharacterRange
并在完成后转换回字符串。
使用RegExp
void main() {
String text = "testsomethin la ba kalom 😊😊😊";
final RegExp regExp = RegExp(
r'(?:[u2700-u27bf]|(?:ud83c[udde6-uddff]){2}|[ud800-udbff][udc00-udfff]|[u0023-u0039]ufe0f?u20e3|u3299|u3297|u303d|u3030|u24c2|ud83c[udd70-udd71]|ud83c[udd7e-udd7f]|ud83cudd8e|ud83c[udd91-udd9a]|ud83c[udde6-uddff]|ud83c[ude01-ude02]|ud83cude1a|ud83cude2f|ud83c[ude32-ude3a]|ud83c[ude50-ude51]|u203c|u2049|[u25aa-u25ab]|u25b6|u25c0|[u25fb-u25fe]|u00a9|u00ae|u2122|u2139|ud83cudc04|[u2600-u26FF]|u2b05|u2b06|u2b07|u2b1b|u2b1c|u2b50|u2b55|u231a|u231b|u2328|u23cf|[u23e9-u23f3]|[u23f8-u23fa]|ud83cudccf|u2934|u2935|[u2190-u21ff])');
if (text.contains(regExp)) {
text = text.replaceAll(regExp, '');
}
print(text); /// output: testsomethin la ba kalom
}
注意:对于这种业务逻辑,应该有大量的测试用例。