我想在 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:
- 字节:8 位。 Unicode 字符串在内存或存储中占用的字节数取决于编码。
- 代码单元:可用于在文本编码中表达单个单元的最小位组合。例如,UTF-8 中的 1 个代码单元为 1 个字节,UTF-16 中为 2 个字节,UTF-32 中为 4 个字节。
- 代码点[或符文]:Unicode 字符。 Unicode 空间上的单个整数值(从 U+0000-U+10FFFF)。
- 字素簇:用户感知的单个字符。 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(使用前将#替换为@)