如何在DART中反转字符串? [英] How do I reverse a String in Dart?

查看:26
本文介绍了如何在DART中反转字符串?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个字符串,我想反转它。例如,我正在编写一个用来反转字符串的AngularDart筛选器。这只是为了演示,但它让我想知道如何反转字符串。

示例:

Hello, world

应变为:

dlrow ,olleH

我还应该考虑使用Unicode字符的字符串。例如:'Ameu{301}lie'

反转字符串的简单方法是什么,即使它已经反转了?

推荐答案

问题定义不明确。颠倒任意字符串是没有意义的,并且会导致输出中断。第一个(可克服的)障碍是UTF-16。DART字符串编码为UTF-16,仅颠倒代码单元会导致无效字符串:

var input = "Music u{1d11e} for the win"; // Music 𝄞 for the win
print(input.split('').reversed.join()); // niw eht rof

split函数显式警告此问题(使用示例):

使用空字符串模式(‘’)拆分在UTF-16代码单元边界处拆分,而不是在符文边界处拆分[.]

有一个简单的解决方法:不是颠倒单个代码单元,而是颠倒符文:

var input = "Music u{1d11e} for the win"; // Music 𝄞 for the win
print(new String.fromCharCodes(input.runes.toList().reversed)); // niw eht rof 𝄞 cisuM

但这还不是全部。符文也可以有特定的顺序。第二个障碍更难解决。一个简单的例子:

var input =  'Ameu{301}lie'; // Amélie
print(new String.fromCharCodes(input.runes.toList().reversed)); // eiĺemA

请注意,重音位于错误的字符上。

可能还有其他语言对单个符文的顺序更加敏感。

如果输入有严格的限制(例如,ASCII或ISO拉丁语1),则在技术上可以颠倒字符串。但是,我还没有看到该操作有任何意义的用例。

使用这个问题作为展示字符串具有类似列表的操作的示例也不是一个好主意。除了少数用例外,字符串必须针对特定的语言,并使用具有特定语言知识的高度复杂的方法来处理。

尤其是以英语为母语的人必须注意:字符串很少能像单字符列表一样处理。在几乎所有其他语言中,这都会导致程序出错。(不要让我开始toLowerCasetoUpperCase...)。

这篇关于如何在DART中反转字符串?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆