1

我正在使用 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 编程语言反转可能包含代理对的字符串?

4

2 回答 2

1

反转字符串时,必须对字素进行操作,而不是字符或代码单元。使用grapheme_splitter

于 2019-10-13T11:09:35.807 回答
0

Dart 2.7 引入了一个支持grapheme cluster-aware 操作的新包。该包称为characters. characters是表示为 Unicode 扩展字素簇的字符包。

Dart 的标准 String 类使用 UTF-16 编码。这是编程语言中的常见选择,尤其是那些支持在设备和网络上本地运行的语言。

UTF-16 字符串通常运行良好,并且编码对开发人员是透明的。但是,在操作字符串时,尤其是在操作用户输入的字符串时,您可能会遇到用户感知为字符的内容与在 UTF-16 中编码为代码单元的内容之间的差异

资料来源:Michael Thomsen 的“宣布 Dart 2.7:更安全、更具表现力的 Dart” ,“安全子字符串处理”部分

该软件包还将帮助您以本地程序员所期望的方式使用表情符号反转您的字符串。

使用 simple Strings,你会发现问题:

String hi = 'Hi ';
print('String.length: ${hi.length}');
// Prints 7; would expect 4

characters

String hi = 'Hi ';
print(hi.characters.length);
// Prints 4
print(hi.characters.last);
// Prints 

值得看一下包的源代码characters,它远非简单,但看起来比grapheme_splitter. 该characters软件包也由 Dart 团队维护。

于 2020-01-16T16:09:16.523 回答