我使用Dart玩算法,当我实际上遵循TDD时,我意识到我的代码有一些限制。
我试图将字符串反转作为面试问题的一部分,但我无法正确地反转代理对。
const simple = 'abc';
const emoji = '🍎🍏🐛';
const surrogate = '👮🏽♂️👩🏿💻';
String rev(String s) {
return String.fromCharCodes(s.runes.toList().reversed);
}
void main() {
print(simple);
print(rev(simple));
print(emoji);
print(rev(emoji));
print(surrogate);
print(rev(surrogate));
}
输出:
abc
cba
🍎🍏🐛
🐛🍏🍎
👮🏽♂️👩🏿💻
💻🏿👩️♂🏽👮
你可以看到,简单的表情符号被正确地反转了,因为我使用的是runes
,而不是简单地执行s.split('').toList().reversed.join('');
,但是代理对被错误地反转了。
如何使用Dart编程语言反转可能包含代理项对的字符串?
3条答案
按热度按时间xmakbtuz1#
当反转字符串时,必须对字素进行操作,而不是字符或代码单位。使用grapheme_splitter。
cbeh67ev2#
Dart 2.7引入了一个新的包,supports grapheme cluster-aware操作。该包被称为
characters
。characters
是一个表示为Unicode扩展grapheme clusters的字符包。Dart的标准String类使用UTF-16编码。这是编程语言中的常见选择,特别是那些支持在设备和Web上本地运行的语言。
UTF-16字符串通常工作良好,编码对开发人员是透明的。但是,当操作字符串时,特别是当操作用户输入的字符串时,您可能会遇到用户认为的字符和UTF-16编码的代码单元之间的差异。
该软件包还将帮助您以本机程序员期望的方式使用emoji反转字符串。
使用简单的
String
s,您会发现问题:关于
characters
值得一看的是source code of the
characters
package,它远不简单,但看起来比grapheme_splitter
更容易消化和更好地记录。characters
包也由Dart团队维护。yptwkmov3#
在名为
reversed
的String
上创建extension
要添加
GraphemeSplitter
类,请安装grapheme_splitter
包:示例程序:
data.dat 文件输出
输出显示在 file 中而不是
terminal
中,因为大多数terminal
无法正确呈现这些字符。