如何从 Flutter 中的字符串中删除/检测整个表情符号?

2024-02-22

我想在 Flutter(或 Dart)中模拟字符串中的键盘退格删除事件。就像是:

String str = "hello????????你们????????????‍????‍????"
myBackspace(str) // will return "hello????????你们????????"
myBackspace(str) // will return "hello????????你们????"
myBackspace(str) // will return "hello????????你们"
myBackspace(str) // will return "hello????????你"
myBackspace(str) // will return "hello????????"
myBackspace(str) // will return "hello"
myBackspace(str) // will return "hell"

Update

Dart 团队发布了辅助包 https://pub.dev/packages/characters这有助于实现这一目标。String.characters.skipLast(1)应该能够做到你所期望的。

旧答案

首先,让我们了解一些定义。根据this https://engineering.linecorp.com/en/blog/the-7-ways-of-counting-characters/ page:

  1. 字节:8 位。 Unicode 字符串在内存或存储中占用的字节数取决于编码。
  2. 代码单元:可用于在文本编码中表达单个单元的最小位组合。例如,UTF-8 中的 1 个代码单元为 1 个字节,UTF-16 中为 2 个字节,UTF-32 中为 4 个字节。
  3. 代码点[或符文]:Unicode 字符。 Unicode 空间上的单个整数值(从 U+0000-U+10FFFF)。
  4. 字素簇:用户感知的单个字符。 1 个字素簇由多个代码点组成。

当您使用删除最后一个字符时substring,您实际上正在删除最后一个代码单元。如果你跑print(newStr.codeUnits) and print(str.codeUnits),你会看到符文128512相当于代码单元的联合55357 and 56832, so 55357实际上是有效的,但如果没有另一个代码单元的“帮助”,则不代表任何内容。

事实上,你不想使用substring()当字符串中存在非 ASCII 字符(如表情符号或阿拉伯字母)时。它永远不会起作用。您要做的就是删除最后一个字素簇。就这么简单:

str.graphemeClusters.removeLast()

然而,Dart 还不支持这一点。围绕这一点有几个问题。其中一些:https://github.com/dart-lang/language/issues/34 https://github.com/dart-lang/language/issues/34
https://github.com/dart-lang/language/issues/49 https://github.com/dart-lang/language/issues/49

缺乏支持可能会导致其他一些问题,例如您提到的问题和这个问题:https://github.com/flutter/flutter/issues/31818 https://github.com/flutter/flutter/issues/31818

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 Flutter 中的字符串中删除/检测整个表情符号? 的相关文章

随机推荐